+최소제곱법
샘플데이터들을 최대한 근사할 수 있는 하나의 직선이나 평면으로 모델링하여 다른 샘플들도 모델링한 시스템으로 예측할 수 있다.
실제 해(샘플데이터)와 모델이 예측한 결과와의 차이가 최소가 되게하는 방식.
샘플데이터 (x, Y)
y=ax+b 인 모델로 예측.
에러값을 오차^2의 합으로 한다. (Y-(ax+b))^2 으로 해야 맞는데, 제곱이므로 상관없다.
J(Cost) =
위 Cost Function을 a, b로 각각 편미분하여 0이 되도록 한다. 최적화 문제. (위 cost function이 convex 형태이기 때문에 가능하다. 아니면 local minima 문제가 있음.)
위 식을 정리하면
: 1번식
: 2번식
2식을 n으로 나누면
: 3번식
3번식에서 b를 구해 번식에 대입한다.
a로 묶어주면
양변을 n으로 나눠주면
a를 뺀 왼쪽부분을 잘 보면 (제곱의 평균 - 평균의 제곱)이다. 어디서 많이 본 형태이다. 이것은 x의 분산이다.
분산은 또 편차 제곱의 평균이다. 즉, 왼쪽 부분을 다르게 표현하자면 아래와 같다... (전개해서 계산하면 똑같다는 것을 알 수 있다.)
양변에 n을 곱하면
따라서 a를 구할 수 있다.
a의 의미를 보자면,
a= 편차곱의 합 / 편차제곱의 합
같은 값으로 분자 분모를 각각 n으로 나누게 되면
a = 편차 곱의 평균 / x의 편차제곱의 평균이 되고, 이것은
= x,y 공분산 / x의 분산.
결국 a 는 공분산을 x의 분산으로 나눈 값이된다.
a를 구한다음에는 b를 쉽게 구할 수 있다. (3번식에 대입)
+예제) 임의의 점 7개를 생성. (black box 모델을 임의로 만들고 노이즈를 추가하였음.)
[Python Code]
import numpy as np
import matplotlib.pyplot as plt
# some data
x=np.random.rand(7)*10
print('x=',x)
# black box + noise
y=x*1.5 + np.random.rand(len(x))*3
print('y=', y)
# model : y = ax + b
mx = np.average(x)
my = np.average(y)
print('mx=', mx, ' my=', my)
a1=np.average((x-mx)*(y-my))
a2=np.average(np.power((x-mx), 2))
a=a1/a2
b=my - a * mx
print('a=',a, 'b=',b)
plt.figure()
plt.scatter(x,y, marker='o', c='blue')
# predict
newx=np.arange(0, 10, 0.2)
yy = a*newx + b
print('predict yy=', yy)
plt.scatter(newx,yy, marker='+', c='red')
plt.show()
[결과]
x= [ 5.91242894 8.31159962 5.84424276 1.6816099 3.96831144 5.44434753
4.99976856]
y= [ 11.3111561 14.27345181 9.25338631 4.42757815 7.11410915
8.43423682 7.51826014]
mx= 5.16604410833 my= 8.90459692524
a= 1.49495983563 b= 1.18156847417
임의의 파란점을 기반으로 최소제곱법으로 주어진 모델로 추정선을 만들어 그림.
'Math' 카테고리의 다른 글
integral sec(x) (0) | 2019.03.28 |
---|---|
integral csc(x) (0) | 2019.03.27 |
[선형대수] 프로젝션, 최소제곱법 (0) | 2019.03.26 |
[미분] 미분 (0) | 2017.05.08 |
[적분] 곡선의 길이 계산2 (0) | 2017.05.08 |