이전에 Gradient Descent라는 기법을 이용하여 단항에서 자동으로 새터를 구해 주었습니다.

이번에는 다항일 때의 Gradient Descent 기법을 알아 보겠습니다.



다항일 때는 별로 달라지는게 없고 x0이 원래 존재 했었지만 1이여서 생략 했던 것이고

이전에 구한 multiple variable cost function에 h를 구한 식을 가져다가 

n(number of features) 만큼 iteration을 돌리면 됩니다.





식을 그림과 같으며 코드를 구현해 보면

* Gradient Descent Multi

function [theta, J_history] = gradientDescentMulti(x, y, theta, alpha, iterations)


m = length(y); % number of rows

n = size(x, 2); % number of features

    


    h = zeros(n, 1);

    J_history = zeros(iterations, 1);

    for i=1:iterations


    % sum of all hypotesis * x

    for j=1:n

H = (theta' * x')';

h(j) = sum((H - y)' * x(:, j));


    end


    % update theta

    for j=1:n

    theta(j) = theta(j) - alpha * (h(j) / m);

    end


    % add history

    J_history(i) = computeCostMulti(x, y, theta);

 

    end


end


다항 코스트 펑션 구하는 코드 + 단항 GD 코드로 구해지는 것을 알 수 있습니다.


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

>> n = size(data, 2);

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

>> y = data(:, n);

>> m = length(x);

>> [x, mu, sigma] = meanNormalization(x);

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

>> theta = zeros(n, 1)

>> alpha = 0.01;

>> iterations = 1500;

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


theta =


  3.4041e+005

  1.1063e+005

  -6.6493e+003


새터가 새로 변경된 것을 볼 수 있습니다.


그럼 코스트 펑션을 다시 구해보면


>> computeCostMulti(x, y, theta)

ans =   2.0433e+009


위와 같이 코스트 펑션이 나옵니다.

이 값이 reasonable 한지는 차차 알아보도록 하겠습니다.

'ML > octave구현 - w1' 카테고리의 다른 글

[octave] Stochastic Gradient descent  (0) 2016.03.22
[octave] Normal equation  (0) 2016.03.13
[octave] feature mean normalization  (0) 2016.03.10
[octave] multiple variable cost function  (0) 2016.03.10
[octave] 임의 값 예측  (0) 2016.03.07

다항일경우 각 feature에 대한 스케일 조정이 필요합니다.

예를들어 size는 4자리의 수를 표현되고 방의개수는 1자리로 표현됩니다.

이렇게 스케일이 안맞을 경우 Gradient Descent에서 찾는데 많이 걸리기 때문에 스케일을 먼저 조정해 줄 필요가 있습니다.





* 그림 설명 - 왼쪽그림은 스케일 조정이 되지 않아 GD가 오래 걸리니 오른쪽 그림처럼 스케일을 조정해야 속도가 빠릅니다.





* 그림 설명 - Mean normalization이라는 기법을 이용하여 x의 범위를 조정해주는 기법



그럼 Mean normalization을 이용하여 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


먼저 현재 데이터를 스케일 조정 없이 데이터를 그려보도록 합니다.


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

>> n = size(data, 2);

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

>> y = data(:, n);

>> plot(x(:, 1), y, 'rx')
>> hold on
>> plot(x(:, 2), y, 'bx')


보는것과 같이 값의 스케일이 너무 안맞아서 파란색 데이터가 안보이는 것을 볼 수 있습니다.

그럼 이를 해결 할 앞서 설명한 mean normalization에 대해 구현해보면

mean normalization 구현
function [x_normal, mu, sigma] = meanNormalization(x)

m = length(x); % number of rows
n = size(x, 2); % number of features

% init return data
x_normal = x;
mu = zeros(n, 1);
sigma = zeros(n, 1);
% calc mu(mean) and sigma(standard deviation)
for i=1:n
mu(i) = mean(x(:, i));
sigma(i) = std(x(:, i));
end

% calc data
for(i=1:n)
for(j=1:m)
x_normal(j, i) = (x(j, i) - mu(i)) / sigma(i);
end
end
end

뮤에 평균, 시그마에 표준변차를 구하고 그 값을 이용하여
기존 데이터를 평탄화 해주었습니다.

그 결과를 다시 x에 대입하여 그래프를 그려보면

>> [x, mu, sigma] = meanNormalization(x);
>> mu
mu =

   2000.6809
      3.1702

>> sigma
sigma =

   794.70235
     0.76098

>> x
x =

  1.3001e-001  -2.2368e-001
  -5.0419e-001  -2.2368e-001
  5.0248e-001  -2.2368e-001

...


>> plot(x(:, 1), y, 'rx')

>> hold on

>> plot(x(:, 2), y, 'bx')



그래프와 같이 0을 중심으로 데이타가 모여 있는 것을 확인 할 수 있습니다.


이후에 앞에서 설명한 cost function 을 구해보면



>> m = length(x);
>> x = [ones(m, 1), x]; % add x0 1
>> theta = zeros(n, 1)
>> computeCostMulti(x, y, theta)
ans =   6.5592e+010

feature를 변경해도 값이 그대로 인 것을 볼 수 있습니다.


'ML > octave구현 - w1' 카테고리의 다른 글

[octave] Normal equation  (0) 2016.03.13
[octave] Multiple Variable Gradient Descent  (0) 2016.03.11
[octave] multiple variable cost function  (0) 2016.03.10
[octave] 임의 값 예측  (0) 2016.03.07
[octave] GradientDescent  (0) 2016.03.07

이전까지는 단항(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] 일때 코스트 펑션을 구해 보았습니다.


+ Recent posts