Notice
Recent Posts
Recent Comments
Link
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
관리 메뉴

이지훈님의 블로그

Linear Regression 본문

ML

Linear Regression

개발자입니다. 2017. 4. 20. 23:14

Linear Regression

1. 개요

통계학에서, 선형 회귀는 종속 변수 y와 한 개 이상의 독립변수 X와의 선형 상관관계를 모델링하는 회귀분석 기법  - 위키피디아 < 선형회귀 >




X = [1, 2, 3, 4, 5]
Y = [1, 2, 3, 4, 5] 
Y = aX + b로 가정, 이것을 hypothesis라고 한다.
위처럼 X와 Y의 값을 가질 때, 사람은 Y = X 관계이며 만약 X가 6일때 Y가 6의 값을 가지는 것도 알 수 있음. 
하지만 컴퓨터는 Y = X의 관계를 바로 찾을 수 없음. 
즉 컴퓨터로 학습을 통해 독립변수 X가 들어왔을 때, Y가 어떤 값을 가질수 있는지 구하는 가장 간단한 방법이 선형회귀임. 

2. 방법

0) 데이터

총 4개의 데이터가 있고 각각 (x, y) 2차원 좌표로 이루어짐. 우리의 목표는 2차원 그래프에서 X에 맞는 Y를 나타내는 1차원 선을 구하는 것!

1번 데이터 ( 2, 5 )
2번 데이터 ( 3, 7 )
3번 데이터 ( 4, 9 )
4번 데이터 ( 5 , 11)


1) 일단 대입

1차원 직선 y = aX+b에 난수를 넣자. [ a = 1, b = 10으로 가정]

Y = 1X + 10 그래프임.


1번 데이터의 X를 대입  y = 1 * (2) + 10 , y = 12

2번 데이터의 X를 대입 y = 1 * (3) + 10, y = 13

3번 데이터를 X를 대입 y = 1 * (4) + 10, y = 14

4번 데이터를 X를 대입 y = 1 * (5) + 10 y = 15


데이터를 보면 Y는 [5, 7, 9, 11]이 나옴. 하지만 Y = 1X + 10의 식으로 계산하면 [12, 13, 14, 15]가 나옴


2) 오차를 구하자.

오차는???

정답이 되어야할 값 [5, 7, 9 , 11]에서 식에서 나온 값 [12, 13, 14, 15]를 빼고 제곱을 함.

[ -7, -6, -5, -4 ] > [ 49, 36, 25, 16 ]


제곱을 하는 이유는???

제곱을 함으로 방향이 없어짐. 오차가 마이너스 값이든 플러스 값이든 생각할 필요없이 0에 가까울수록 오차가 줄어든다는 것을 알 수 있음.

오차의 합을 구함

오차의 합은 126

오차의 제곱의 합이 최소가 되도록 하는 방법을 최소자승법이라고 함

위키피디아 <최소자승법 설명>


오차의 평균을 구함

평균은 126/4 = 31.5

이것을 평균제곱오차(Mean Square Error)라고 함.

위키피디아 < Mean Square Error>


오차의 평균이 작을수록 데이터에 맞는 직선임..


3) 오차의 평균이 최소가 되로록 Gradient Descent

Gradient Descent는 경사하강법이라고 하며, Gradient의 반대방향으로 이동하면서 최소값을 구할 수 있는 방법임.

여기서 오차를 Cost, Loss라 하며, mean을 구하는 식(함수)을 Cost Fucntion 또는 Loss Function으로 정의함.

Cost Function, Loss Function을 최소화 하는 값을 찾아야함. 평가함수라고도 함.

다시 정리하면 비용을 구하기 위한 방법, 비용이 최소화되는지 평가하는 함수.

말들이 너무 어렵....


아래는 오차, 오차의 합, 오차의 평균을 구하는 식.



왜 평균은 2/n일까는 밑에서 설명하겠음.

이제 Mean의 식에서 a, b로 편미분을 함.



편미분 과정에서 2/n이 1/n으로 바뀌면서 식이 깔끔해짐.

계산의 편의를 위해 2를 넣는거임. ( * 안넣어도 상관없음.)


a와 b로 편미분 함으로 

평가함수에서 a의 변화량, b의 변화량을 구할 수 있음.

비용함수가 최소가 되도록 a와 b의 기울기 반대 방향으로 내려가야함.


왜 반대방향인지 이해를 돕기위해 링크 첨부함.


< 알고리즘 설명 >


위 링크의 설명대로 반대 방향으로 쭉!! 가다보면 최소값을 찾을 수 있음.

근데 그냥 가다보면이 아니라 learningrate(학습율) 와 변화량만큼 이동함. 

그 이유는 너무 많이 이동하면 최소가 되는 지점을 지나칠 수 있음.


최종적으로


설명이 많이 부족.

글로 이해가 안되면 코드를 참조


4) 구현

언어 : 파이썬


import random
size = 4.
dataset_x = [2, 3, 4, 5]
dataset_y = [5, 7, 9, 11]
learning_rate = 0.01
repeat = 10000

def grading_descent(a, b):
	move_a = 0
	move_b = 0
	for x, y in zip(dataset_x, dataset_y):
		move_a +=  (1 / size) * ( (-x)  *  ( y- (a * x) - b) )
		move_b +=  (1 / size) * ( (-1)  *  (y - (a * x) - b) )
	a = a - learning_rate * move_a
	b = b - learning_rate * move_b

	return a, b

if __name__ == '__main__':
	
	a = random.random()
	b = random.random()
	for i in range(repeat):
		new_a, new_b = grading_descent(a, b)
		a = new_a
		b = new_b	

	print a
	print b
















'ML' 카테고리의 다른 글

Naive Bayesian Classification (python code)  (0) 2017.07.18
Logistic Regression  (0) 2017.07.10
Decision Tree + C4.5알고리즘  (0) 2017.07.03
Decision Tree + ID3알고리즘  (0) 2017.07.01
Linear Classifier  (0) 2016.07.13
Comments