일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Tire
- 스택
- Scienceplots
- TypeError
- mMAPE
- python 갯수세기
- RMES
- MAPE
- 코테
- 파이썬을파이썬답게
- PAPER
- Alignments
- iNT
- Pycaret
- 평가지표
- knn
- 논문
- mes
- KAKAO
- 에러해결
- 논문작성
- 카카오
- Mae
- n_sample
- n_neighbors
- SMAPE
- Python
- 프로그래머스
- Overleaf
- 논문editor
- Today
- Total
EunGyeongKim
지도학습 : 회귀(Regression)_1차원 데이터 선형모델 매개변수의 해석해 (2) 본문
이전에 공부했던 내용과 이어집니다.(링크)
경사하강법은 반복계산에 의해 근사값을 구하는 수치 계산법 (수치해, Numerical Analysis)
직선모델의 경우에는 근사적인 해석이 아니라 방정식을 해결하여 정확한 해를 구할 수 있음( = 해석해, analysis : 해석적(analytic)으로 풀이가 가능한 해)
해석해를 도출하면 문제의 본질을 잘 이해할 수 있고, 다차원데이터에 대응하며, 곡선모델로 확장하기 좋고, 커널법 등의 이해를 도와줌
목표는 'J가 극소화 되는 지점 w를 찾기'. 그 지점의 기울기는 0이므로 기울기가 0이되는 지점 w를 찾으면 됨. w는 '∂J / ∂w0 = 0' 과, '∂J/∂w1 = 0' 을 충족하는 w0, w1을 찾으면 됨.
w0, w1의 편미분 부분 식
$$\frac{\partial J}{\partial w_0} = \frac{2}{N}\sum_{n=0}^{N-1}(w_0x_n + w_1 - t_n)x_n = \frac{2}{N}\sum_{n=0}^{N-1}(y_n - t_n)x_n$$
$$\frac{\partial J}{\partial w_1} = \frac{2}{N}\sum_{n=0}^{N-1}(w_0x_n + w_1 - t_n) = \frac{2}{N}\sum_{n=0}^{N-1}(y_n - t_n)$$
위 식을 0으로 한 식에서 출발하겠음.
$$\frac{\partial J}{\partial w_0} = \frac{2}{N}\sum_{n=0}^{N-1}(w_0x_n + w_1 - t_n)x_n = 0$$
$$\frac{\partial J}{\partial w_1} = \frac{2}{N}\sum_{n=0}^{N-1}(w_0x_n + w_1 - t_n) = 0$$
w0 편미분 부분 식을 2로 나눔
$$\frac{1}{N}\sum_{n=0}^{N-1}(w_0x_n + w_1 - t_n)x_n = 0$$
합의 기호를 각 항에 전개하면 다음과 같음
$$\frac{1}{N}\sum_{n=0}^{N-1}w_0x_n^2 + \frac{1}{N}\sum_{n=0}^{N-1}w_1x_n - \frac{1}{N}\sum_{n=0}^{N-1}t_nx_n = 0$$
1항의 w0는 n과 관계가 없기 떄문에 합의 기호 바깥으로 꺼낼 수 있음. 2항의 w1도 n과 관계가 없는 상수이므로 이것 또한 합의 기호 바깥은로 꺼낼 수 있음. 결과적으로 다음 식과 같음.
$$w_0\frac{1}{N}\sum_{n=0}^{N-1}x_n^2 + w_1\frac{1}{N}\sum_{n=0}^{N-1}x_n - \frac{1}{N}\sum_{n=0}^{N-1}t_nx_n = 0$$
1항의 합의 기호는 입력데이터 x의 제곱의 평균, 2항은 입력 데이터 x의 평균, 3항은 목표 및 입력데이터의 곱의 평균을 나타냄. 이를 다음과 같이 나타낼 수 있음
$$<x^2> = \frac{1}{N}\sum_{n=0}^{N-1}x_n^2, <x> = \frac{1}{N}\sum_{n=0}^{N-1}x_n, <tx> = \frac{1}{N}\sum_{n=0}^{N-1}t_nx_n$$
일반적으로 <f(x)>로 f(x)의 평균을 나타냄. 그러면 다음식으로 나타낼 수 있음
$$w_0<x^2>+w_1<x>-<tx> = 0$$
같은 방법으로 w1의 편미분을 정리하면 다음과 같음
$$w_0<x>+w_1-<t> = 0$$
이후에 연립방정식으로 w0과 w1을 구함. w1을 정리한 식을 변경하여 w0에 대입하여 'w0 = 0' 모양으로 정리.
$$w_1 = <t>-w_0<x>$$
그럼 다음과 같은 식을 얻음 (식 1)
$$w_0 = \frac{<tx>-<t><x>}{<x^2>-<x>^2}$$
이 w0를 사용하여 w1도 구할 수 있음 (식2)
$$w_1 = <t>-w_0<x>$$
$$= <t> - \frac{<tx>-<t><x>}{<x^2>-<x>^2}<x>$$
식1, 식2는 w의 해석해임. <x^2>와 <x>^2는 서로 다른수치임으로 주의! <x^2>는 x^2의 평균, <x>^2은 <x>의 제곱
입력데이터 x, 목표데이터 t 값을 식에 넣어 w를 찾아보면 다음과 같은 결과가 얻어짐
# 해석해
def fit_line(x, t):
mx = np.mean(x)
mt = np.mean(t)
mtx = np.mean(t*x)
mxx = np.mean(x*x)
w0 = (mtx - mt * mx) / (mxx - mx**2)
w1 = mt - w0 * mx
return np.array([w0, w1])
# main
W = fit_line(x, t)
print("w0={0:.3f}, w1={1:.3f}".format(W[0], W[1]))
mse = mse_line(x, t, W)
print("SD={0:.3f}cm".format(np.sqrt(mse)))
plt.figure(figsize = (4,4))
show_line(W)
plt.plot(x, t, marker='o', linestyle='None', color='cornflowerblue', markeredgecolor = 'black')
plt.xlim(x_min, x_max)
plt.grid(True)
plt.show()
즉, 직선으로 피팅한다면 해석해를 도출해 낼 수 있으므로 경사하강법을 사용할 필요가 없음.
경사하강법은 해석해가 구해지지 않는 모델에서 힘을 발휘함.
전체 코드(https://github.com/EunGyeongKim/Machine-learning/blob/main/LinearRegression_Gradient_descent.py)
'ML & DL > 딥러닝' 카테고리의 다른 글
지도학습 : 회귀_1차원 데이터(선형 기저 함수 모델, 가우시안) (1) (0) | 2023.02.23 |
---|---|
지도학습 : 회귀_2차원 모델(평면) (0) | 2023.02.22 |
지도학습 : 회귀 (Regression)_1차원 데이터, 직선 (1) (0) | 2023.02.20 |
미분, 편미분 (0) | 2023.02.20 |
머신러닝에 필요한 수학과 numpy코드 (0) | 2023.02.20 |