이전 블로그에서 데이터에 맞는 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)




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


우리의 목표는 cost function값이 최소가 되는 새터를 찾는다고 하였습다.

먼저 새터를 찾는다는 것이 무엇인지 확인해 볼 필요가 있을 것 같습니다.


앞서 plot을 통해 x, y를 표시하던 그래프에 cost function으로 오차율을 나타내고

실제 새터를 그래프로 그려보면서 수동으로 새터를 찾아 보겠습니다.


먼저 새터를 그리는 함수부터 정의해봅니다.


* 새터를 표시하는 plot 함수


function plotManualTheta(x, y, theta)

plot(x(:,2) , y, 'rx', 'MarkerSize', 5); % first plot


hold on; % keep previous plot visible

plot(x(:,2), x*theta, '-') % second plot

legend('Training data', 'Linear regression') % legend

hold off % don't overlay any more plots on this figure


end


: hold on - plot을 고정 시키는 명령어

: legend - 범례

: hold off - plot 고정 해제


: plot(x(:,2), x*theta, '-') 

 - 두번째 plot을 그리는 x, y 데이터 입니다.

 - 여기서 두번째 파라미터에는 x와 theta에서 들어온 값을 곱해 줍니다.

 - 행렬 곱을 이용하여 x = 1 * 2, y = 2 * 1 행렬을 곱하여 1*1행렬로 계산하여 그래프를 표시 합니다.



예제를 통해 알아 보겠습니다.

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

>> y = data(:, 2);

>> m = length(y);

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

>> theta = zeros(2, 1);


* 새터가 0,0 일때

>> computeCost(x, y, theta)

h =  6222.1

ans =  32.073

>> plotManualTheta(x, y, theta)


* 새터가 0, 1일때

>> theta = [0; 1]


>> computeCost(x, y, theta)

h =  1444.5

ans =  7.4459

>> plotManualTheta(x, y, theta)



위와 같이 계속 하다 보면 최적의 새터를 찾을 수 있습니다.


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

[octave] 임의 값 예측  (0) 2016.03.07
[octave] GradientDescent  (0) 2016.03.07
[octave] Cost Function 구하기  (0) 2016.03.06
[octave] 데이터 뿌리기 (plot)  (0) 2016.03.06
[octave] 파일 읽기  (0) 2016.03.06

+ Recent posts