건프의 소소한 개발이야기

[ML - Matlab/Octave] Linear Regression with Single Variable 본문

개발 이야기/Machine Learning 이야기

[ML - Matlab/Octave] Linear Regression with Single Variable

건강한프로그래머 2016. 4. 17. 14:52

안녕하세요, 건프입니다.


이번엔 데이터처리를 간단하게 도와주는 Octave 라는 프로그램으로 Linear 한 예측함수와 그래프를 만드는 것을 해보려고 합니다.


1. 우선 데이터를 메모리 상으로 로드해야합니다. 

Octave에서는 공백기준으로 나누어져있는 데이터를 행렬데이터로 다음과 같이 쉽게 로드할 수 있습니다.




위 데이터에서 첫번째 열(column) 은 데이터 값(지금은 Single variable 이므로 고려해야할 데이터값이 하나입니다) 이고, 

두번째 열은 실제 도출된 결과값 에 대한 정보입니다.


2, 우리는 이 데이터를 X(input data) 와 y(real output data) 로 나눠야 합니다.

나누는 방법은 다음과 같습니다.




첫번째 인자의 : 는 모든 행의 값을 모두 가져와달라는 의미이고

두번째 인자의 1 또는 2 는 1열 또는 2열의 값만 가져오라는 의미입니다.


3. 이렇게 우리는 X 와 y를 분리했으니, 이 정보를 그래프로 그릴 수 있습니다.


figure;                                                                % 새로운 창을 띄어서 작업해달라는 명령어

plot(x, y, 'rx', 'MarkerSize', 3);                           %x 축 데이터, y축 데이터, 빨간색 x모양 표시로 찍어라, 마커사이즈는 3으로 해달라의 의미

ylabel('Profit in $10,000s');                              %y 축 라벨

xlabel('Population of City in 10,000s');


이렇게 하면




위와 같은 데이터를 눈으로 확인할 수 있습니다. 


4. 데이터를 확인했으니, 예측함수를 그려봐야 합니다.


하지만 예측함수를 구하기 위해서는 다음 두 단계를 거쳐야 합니다.

- computeCost 함수를 정의해서, 예측값과 실제값의 차이를 보여주는 함수를 만들고,

- gredientDescent 함수를 만들어서, theta(세타) 값을 일정 반복과정을 통해 cost함수의 결과값이 가장 작게 나오는 theta를 찾아야 합니다.


computeCost 는 다음과 같이 정의 할 수 있습니다.

function J = computeCost(X, y, theta)

% COMPUTECOST Compute cost for linear regression

%   J = COMPUTECOST(X, y, theta) computes the cost of using theta as the

%   parameter for linear regression to fit the data points in X and y


% Initialize some useful values

m = length(y); % number of training examples


% You need to return the following variables correctly 

J = 0;


% Instructions: Compute the cost of a particular choice of theta

%               You should set J to the cost.


h = X * theta;

J = (1/(2*m))*sum((h-y).^2);


end


Octave 에서는 function 을 정의할때 위와 같은 형식으로 정의합니다.

함수나 for 문같은 반복문이 끝날때는 뒤에 end를 붙여줘야 합니다


gredientDescent 함수도 다음과 같이 정의할 수 있습니다.

function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters)

% GRADIENTDESCENT Performs gradient descent to learn theta

%   theta = GRADIENTDESENT(X, y, theta, alpha, num_iters) updates theta by 

%   taking num_iters gradient steps with learning rate alpha


% Initialize some useful values

m = length(y); % number of training examples

J_history = zeros(num_iters, 1);


for iter = 1:num_iters

    % Instructions: Perform a single gradient step on the parameter vector

    %               theta. 

    %

    % Hint: While debugging, it can be useful to print out the values

    %       of the cost function (computeCost) and gradient here.

    %

    

    h = X * theta;

    theta = theta - (alpha/m) * (X' * (h-y));


    % Save the cost J in every iteration    

    J_history(iter) = computeCost(X, y, theta);

    % fprintf('iter : %f , J_history : %f\n', iter, J_history(iter));


end


end


여기서 num_iter = 1500 으로 설정하였고,

alpha = 0.01 로 설정하였습니다.

X' 는 transposition(x) 입니다.


이렇게 구한 theta 를 가지고 표를 다시 그린다면

% Plot the linear fit

hold on;                                                                     % keep previous plot visible

plot(X(:,2), X*theta, '-')                                               % y축에는 예측함수의 값이 들어갑니다

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

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




이렇게 Linear 한 예측함수를 만들 수 있습니다.


참고

plot(X(:,2), X*theta, '-') 여기 부분을 plot(X(:,2), X*theta, '*') 이렇게 바꾼다면

선모양이 아니라, * 표모양으로 변해요! 




Comments