이지훈님의 블로그
Linear Regression 본문
Linear Regression
1. 개요
2. 방법
0) 데이터
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 |