우리의 목표는 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

문서 초반에 설명을 못했지만 이 글을 쓰고 있는 목적은 선형회귀분석을 구하는 것을 octave를 이용하여 구하는게 목적이였습니다.

추후 스칼라를 이용하여 머신러닝을 구현하는것이 최종 Goal.





최종 골은 가장작은 Cost Function을 구하는거고 (오차율 최소화)

거기에 맞는 새터를 구하는것입니다.

(선형 회귀 분석에서 가장 잘 맞는 라인을 찾는 것 이라고 생각하면 됩니다.)


자세한 이론은 추후 설명하고

이번에는 코스트 펑션을 구하도록 구현 해보겠습니다.



식은 아래와 같습니다.

1/2m * 1 to m 까지 ((새터0 + 새터1 * x) - y)제곱 의 더하기

 


cost function을 구현해보면


* 데이터 로딩

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


* y 변수 선언

>>  y = data(:, 2);


* m 변수 선언

>> m = length(y)

m = 97

: 행의 개수


* x 변수 선언

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

: x변수에 첫번째 컬럼에 1값을 대입시킴

: 이유는 cost function의 h에 새터0 + 새터1 * x의 식인데 사실 새터 0에도 x를 곱해야 하는데 1이라 식에서 생략해서 그렇습니다.

x =


    1.0000    6.1101

    1.0000    5.5277

    1.0000    8.5186

    1.0000    7.0032


* 새터 선언

>> theta = zeros(2, 1);

: 0으로 초기화

theta =


   0

   0


* cost function 구현

function J = computeCost(x, y, theta)

m = length(y); % number of rows


J = 0;

h = 0;


for i=1:m

h = h + (theta(1) + theta(2) * x(i, 2) - y(i))^2;

end


h % print hypothesis

J = h / (2*m);


end


* cost function 호출

>> computeCost(x, y, theta)

h =  6222.1

ans =  32.073


32.073이라는 값이 리턴됩니다.

이 값을 최대한으로 줄이는 새터를 찾는게 이 프로그램의 최종 목표입니다.

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

[octave] GradientDescent  (0) 2016.03.07
[octave] 새터에 따른 그래프 모양 확인  (0) 2016.03.06
[octave] 데이터 뿌리기 (plot)  (0) 2016.03.06
[octave] 파일 읽기  (0) 2016.03.06
[octave] 행렬 다루기  (0) 2016.03.05

앞서 얻은 행렬의 data를 그래프로 표현하는 방법에 대해 알아보겠습니다.


Syntax (http://kr.mathworks.com/help/matlab/ref/plot.html)


>> plot(X,Y)example

>> plot(X,Y,LineSpec)

>> plot(X1,Y1,...,Xn,Yn)

>> plot(X1,Y1,LineSpec1,...,Xn,Yn,LineSpecn)


문법은 위와 같습니다.

(참고로 octave와 matlab의 문법은 거의 일치한다고 한다. 대부분 기능도 지원되며)


octave에서는 같은 폴더 위치에 있는 *.m 파일을 자동으로 읽는다고 합니다.

그런 특징을 살려 파일을 여러개로 분할하여 관리합니다.

이번에는 새로운 plotData라는 함수를 만들어서 실행하는 것으로 테스트 해봅니다.


함수의 문법은 아래와 같습니다.


function 함수이름(args...)


end


: 보통의 함수와 같고 end로 끝나는것만 약간 다릅니다.



앞서 X, y로 변수할당한 것을 함수를 통해 표현 해보겠습니다.


function plotData(x, y)

plot(x, y, 'rx', 'MarkerSize', 5);

end


x : 변수

y : 변수

'rx' : red and cross

'MarkerSize', 5 : 좌표 사이즈






옵션은 아래와 같다.



SpecifierLine Style
-Solid line (default)
--Dashed line
:Dotted line
-.Dash-dot line

SpecifierMarker
oCircle
+Plus sign
*Asterisk
.Point
xCross
sSquare
dDiamond
^Upward-pointing triangle
vDownward-pointing triangle
>Right-pointing triangle
<Left-pointing triangle
pPentagram
hHexagram

SpecifierColor

y

yellow

m

magenta

c

cyan

r

red

g

green

b

blue

w

white

k

black


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

[octave] GradientDescent  (0) 2016.03.07
[octave] 새터에 따른 그래프 모양 확인  (0) 2016.03.06
[octave] Cost Function 구하기  (0) 2016.03.06
[octave] 파일 읽기  (0) 2016.03.06
[octave] 행렬 다루기  (0) 2016.03.05

+ Recent posts