경사하강법 코드 돌려보기
정규 방정식
Fish Market의 데이터 중에서 Species:Perch X=Weight y=Length1을 사용하여 정규방정식을 돌려보기로 했다.
그래프를 그려 보면
의 그래프가 나온다.
$\hat{\boldsymbol{\theta}} = (\mathbf{X}^T \mathbf{X})^{-1} \mathbf{X}^T \mathbf{y}$
X_b = np.c_[np.ones((56, 1)), X]
theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
모든 샘플에 $X_0 = 1$ 을 추가함으로써 X_b의 크기는 (56,2)가 된다. (Species:Perch 의 샘플 :56개)
$X^TX$: ( 2, 56 ) ( 56, 2 ) -> ( 2, 2 )
numpy의 inverse함수를 사용해서 역행렬을 구하고
$(X^TX)^{-1}X^T$ (2,2)(2,56)->(2,56)
역행렬과 X의 transpose를 곱해준다.
$(X^TX)^{-1}X^Ty$ (2,56)(56,1)->(2,1)
이후 y를 곱해주면 (2,1)행렬이 된다.
결과값을 보면 행렬을 확인할 수 있다.
이 $\theta$로 직선을 그려보면
정규방정식을 통해 그렸기 때문에 이 직선이 최적의 MSE값을 내는 직선이라고 할 수 있다.
sklearn의 LinearRegression을 사용해서 그려보아도 똑같은 값을 구할 수 있다.
from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
lin_reg.fit(X, y)
lin_reg.intercept_, lin_reg.coef_