이전에 새터를 자동으로 구해주는 Gradient Descent 기법을 설명하였습니다.

하지만 적정한 알파(σ) 값을 지정해 주어야 하고

iteration 크기도 정해 주어야 값이 구해집니다.

(이말은 적정한 알파와 이터레이션 크기를 안해주면 잘 나오지 않는다는 의미도 됩니다.)


그리하여 알파와 이터레이션을 정해주지 않아도 자동으로 새터를 구해주는 Normal equation 기법에 대해 알아 봅시다.




새터를 구하는 공식은 위와 같습니다.


함수로 구현하면 


function theta = normalEquation(x, y)

theta = pinv(x' * x) * x' * y;

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 = normalEquation(x, y)

ans =


  3.4041e+005

  1.1063e+005

  -6.6495e+003


cost function을 구해보면

>> computeCostMulti(x, y, theta)

ans =   2.0433e+009


이며 이전에 구한 값 

theta =


  3.4041e+005

  1.1063e+005

  -6.6493e+003


코스트 펑션은

ans =   2.0433e+009


와 비슷합니다.


단항일 경우 어떨지 다시 비교해보면


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

>> y = data(:, 2);

>> m = length(y);

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

>> theta = zeros(2, 1);

>> theta = normalEquation(x, y)

theta =


  -3.8958

   1.1930


>>computeCost(x, y, theta)

ans =  4.4770


이전에 구한 값은

theta =


  -3.6303

   1.1664


ans =  4.4834


와 같이 비슷합니다.


NE 기법이 GD와 결과도 비슷하고 계산도 빠르다는 것을 볼 수 있습니다.


각각의 장단점은 아래 그림과 같습니다.





GD나 NE를 적절히 사용하라고 하네요.

+ Recent posts