Python/Python X 머신러닝

1차 선형회귀 예제(파이썬 정규 방정식)

힘법사 2020. 10. 16. 23:31
728x90

  이번 포스팅은 1차선형휘귀를 정규 방정식으로 하는 것을 보여드리겠습니다. 다른 방법을 보고 싶으신분은 다음 링크를 타고 가셔서 보시면 됩니다.

himbopsa.tistory.com/6

 

1차 선형 회귀 예제 경사하강법 사용(C++)

 1. 1차 선형 회귀란? 1차 선형 회귀는 데이터에 대해 최대한 일치하는 y = ax + b를 찾는 것 입니다. 이번 포스팅에서는 C++에서 데이터를 이용해 a와 b 값을 찾아 데이터에 fitting 하는 것을 예시를 ��

himbopsa.tistory.com

 먼저 정규방정식에 대해서 설명을 드리겠습니다.

0) 정규방정식

정규방정식은 analytical 방법입니다. 즉 수학적인 해석을 통해서 최적의 모델을 찾는 방법으로 정리할 수 있습니다.

정규방정식이 이 도구로서 정규방정식을 풀게되면 최적의 모델을 찾을 수 있습니다.

그림1. 정규방정식

 이것이 바로 정규 방정식입니다. X는 x로 이루어진 matrix고 y는 말그대로 y값입니다. 위의 식을 계산하면 너무나 간단하게 모델이 구해집니다.

1) 정규방정식 python으로 계산하기

먼저 사용된 library를 밝히고 시작하겠습니다.

import numpy as np
import matplotlib.pyplot as plt

자, 이제 본격적으로 계산에 들어가겠습니다. 짧은 코드입니다. 코드 옆에 세세하게 주석이 있으니 어렵지 않으실 겁니다.

X =5 * np.random.rand(100,1) # X에 0~5 사이의 랜덤한 값으로 100 by 1 행렬을 생성
Y = 2 * X +1 + np.random.rand(100,1) # Y = 2X + 1 + gaussian noise 형태로 Y를 100 by 1 행렬로 만들었다.
plt.plot( X,Y,".",label = "raw data")
X = np.c_[np.ones((100,1)),X] # np.ones((100,1)) 은 1을 성분으로 하는 100 by 1의 행렬을 만든다는 뜻이다.
#바로 위의 식처럼 1성분을 붙여주는 이유는, theta0, theat1을 둘다 구하기 위해서

#정규 방정식 처럼 계산해보기

theta_final = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(Y)
print(theta_final)
plt.plot([0, 5],[theta_final[1] * 0 + theta_final[1],theta_final[1] * 5 + theta_final[1]],"r--",label = "prediction")
plt.legend()
plt.show()

 먼저 X를 0~5까지 랜덤하게 생성했습니다. 그리고 Y에 원하는 함수를 가우시안 노이즈를 더해서 넣어줬습니다.

그리고 X matrix에 1로만 이루어진 열을 하나 추가해줬는데 그이유는 이 조치를 하지 않고 바로 들어갈 경우 1 by 100 matrix 곱하기 100 by 1 matrix의 결과로서 1 by 1matrix * X.T * Y를 얻게 되는데 이로 인해 우리가 원하는 편향 y = ax + b 의 a 와 b를 둘다 얻을 수 없습니다. 

 이렇게 theta_final을 구해주고 이에 대해서 편향을 print 하면 다음과 같은 결과를 얻습니다.

편향 :

[[1.53371047] [1.98419393]]

저는 y = 2X + 1을 기대했는데 theta_1의 편향은 마음에 되는데 반해 theta_0의 편향이 조금 아쉬운 결과를 얻었습니다. 엄청 나쁘지는 않게 fitting 됬다고 생각합니다.

이제 그래프를 이 편향을 이용해 그려보겠습니다.

그림. fitting한 선과 데이터를 그린 도표

 

그래프를 보니 기울기(theta_1)은 정말 잘 맞습니다. 하지만, 앞서 말씀드렸듯이 theta_0의 편향이 실제 데이터보다 조금 더 위에있는 것을 육안으로도 확인할 수 있습니다.

 이 문제는 차후 다른 알고리즘을 사용하거나, 규제를 더하는 방식으로 개선시킬 수 있을 겁니다.

좀 더 고차원적인 회귀에 대해서 알고 싶은신분은 아래의 링크를 타고 가시면 다항회귀에 대한 글을 보실 수 있습니다.

himbopsa.tistory.com/10

 

다항 회귀(python with sklearn)

이 포스팅에서는 핸즈온 머신러닝 교재에 나오는 다항회귀에 대해서 논하겠습니다. C++로 회귀하는 작업을 보고싶은신 분은 아래 게시물을 참고해 주세요.( C++에서 회귀 코드를 보시면 정확하게

himbopsa.tistory.com

 

이렇게 매우간단한 정규방정식으로 일차선형회귀를 했습니다. 누구나 따라할 수 있을 정도로 편리한 점이 마음에 듭니다. 다음에는 또 다른 주제로 찾아오겠습니다.

728x90

'Python > Python X 머신러닝' 카테고리의 다른 글

릿지 회귀 예제(파이썬/python)  (1) 2020.10.17
다항 회귀(python with sklearn)  (0) 2020.10.16