다항일경우 각 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

+ Recent posts