이전까지는 단항(One Variable) 일 때 선형회귀분석에 대해서 알아 보았습니다.

하지만 현실에서는 단항보다는 여러개의 feature 들(Multiple Variable)로 되어 있는 문제를 많이 접하게 됩니다.


Size (feet2)

Number of bedrooms

Number of floors

Age of home (years)

Price ($1000)

2104

5

1

45

460

1416

3

2

40

232

1534

3

2

30

315

852

2

1

36

178

  



위와 같이 가격을 결정하는데 사이즈, 방의개수, 층수, 년식등 많은 정보들을 필요로 합니다.

이러한 문제 처럼 차례대로 각각을 x1, x2, x3, x4 라고 price를 y라고 설정한 후 단항에서와 같이 똑같이 새터를 구합니다.


다항일 때도 이전에 했던 것과 같이 이 값들을 대표하는 새터를 구하고, 임의의 값에 대한 y를 예측해 보는 것을 설명 하겠습니다.

거의 단항과 비슷하며 몇개 추가된 개념과, feature 개수에 따른 기존 로직 수정이 조금 필요 합니다.





위와 같이 다항일 때는 hypothesis가 구해지는 식입니다.

사실 x0라는 값이 존재하는데 이 값은 1이기 때문에 생략되서 새터 0만 나오는 것입니다.


다항일 경우 위와 같이 간편하게 게산할 수 있습니다. (theta transpose * x)


기존에서 x가 하나 더 추가된 새로운 데이터 셋(ex1data2.txt) 파일 입니다. 

x1, x2, y 순으로 값이 되어 있으며 x1은 size, x2는 방의개수, y는 가격입니다.


2104,3,399900

1600,3,329900

2400,3,369000

1416,2,232000

3000,4,539900


그럼 앞서 설명한 코스트 펑션을 Multiple variable로 확장하여 가장 작은 오차를 찾아 보겠습니다.


* cost function

J = 1/2m * 1 to m 까지 (h(x)- y)제곱 의 더하기

h = theta transpose * x


function J = computeCostMulti(x, y, theta)

m = length(y);

H = (theta' * x')'; % theta transpose * x transpose

S = sum((H - y) .^ 2);

J = S/(2*m);

end


위의 transpose 식을 이용하여 멀티 코스트 펑션을 구해 보았습니다.

참고로 transpose 는 ' 기호를 사용 합니다.


행렬 곱, 행렬 뺄셈 등을 이용하여 여러번 행렬의 트랜스포즈 해주었습니다.


>> data = load('ex1data2.txt');

>> n = size(data, 2);

>> x = data(:, 1:n-1);

>> y = data(:, n);

>> m = length(x);

>> x = [ones(m, 1), x]; % add x zero

>> theta = zeros(n, 1)


>> computeCostMulti(x, y, theta)

ans =   6.5592e+010


위와 같이 새터 [0;0;0] 일때 코스트 펑션을 구해 보았습니다.


이전 블로그에서 데이터에 맞는 theta를 구하였습니다.

theta =


  -3.6303

   1.1664



이 새터를 가지고 그럼 임의의 x값으로 y를 예측 해봅시다.


* 20일 때 y값은 얼마일지?

>> newX = [1, 20]


newX * theta를 통해 y값을 구할 수 있다.


>> predict = newX * theta

predict =  19.697


이와 같이 선형 그래프의 새터를 구하고 x값을 대입하여 y를 구할 수 있습니다.


이것을 그래프로 나타내면


>> plotManualTheta(x, y, theta)

>> hold on

>> plot(20 , predict, 'rx', 'MarkerSize', 25);






와 같이 라인에 정확한 값을 구할 수 있습니다.






앞서 새터로 인하여 cost function와 그래프 모양이 어떻게 변하는지 알아 보았습니다.

여기서는 새터를 자동으로 구해주는 알고리즘인 Gradient Descent 알고리즘에 대해 설명합니다.


Gradient Descent




gradient descent의 알고리즘은 위와 같습니다.

간단하게 설명하면 

: 입력한 iteration 개수 만큼

: 각 새터를 구하고 그값을 이용하여 iteration 을 돌립니다.

: 알파 값도 입력해줍니다.


자세한 이론은 심화 강의를 통해 학습하기 바랍니다.


alpha 값과 iteration 값을 입력해줍니다.



코드는 아래와 같습니다.

function theta = gradientDescent(x, y, theta, alpha, iterations)


    m = length(y); % number of rows

    

    for i=1:iterations

        h1 = 0;

        h2 = 0;


        for j=1:m

            h1 = h1 + (theta(1) + theta(2) * x(j, 2) - y(j));

            h2 = h2 + (theta(1) + theta(2) * x(j, 2) - y(j)) * x(j, 2);

        end


        theta(1) = theta(1) - alpha * (h1 / m);

        theta(2) = theta(2) - alpha * (h2 / m);


        % computeCost(x, y, theta); % print cost function

    end


end


: 앞서 구한 cost function과 유사하며 iterations, alpha 값을 더 입력해준 것이 특징입니다.


그럼 알파, 이터레이션 값까지 하여 알고리즘을 통해 새터를 구한 값을 대입해서 계산합니다.


>> data = load('ex1data1.txt');

>> y = data(:, 2);

>> m = length(y);

>> x = [ones(m, 1), data(:,1)];

>> theta = zeros(2, 1);

>> alpha = 0.01;

>> iterations = 1500;

>> theta = gradientDescent(x, y, theta, alpha, iterations)

theta =


  -3.6303

   1.1664


구한 새터값은 위와 같다. cost function을 구해봅니다.

>> computeCost(x, y, theta)

ans =  4.4834


값이 4.4로 좋아 보입니다.


그래프로 나타나면

>> plotManualTheta(x, y, theta)




위와 같이 꽤 괜찮은 그래프가 그려지는 것을 볼 수 있습니다.


+ Recent posts