Normal Equation
선형회귀Linear Regression
우리는 컴퓨터에게 두가지 방법으로 Weight를 찾게 할 것입니다.
첫번째는 연립방정식(Normal Equation)을 통한 방법이고,
두번쨰는 경사하강법(Gradient Descent)을 통한 방법입니다.
지금은 연립방정식(Normal Equation)을 통한 방법을 알아보겠습니다.
Normal Equation

Normal equation은 Cost Function을 최소화하는데 그 목적이 있습니다.

왼쪽처럼 식을 작성하면 너무 복잡하고 한 눈에 보기도 힘이듭니다. 만약 행렬과 벡터로 표현한다면 식이 한번에 간단해집니다 ! (여기서 ϵ는 잔차를 의미합니다.) 일반적으로 작성할 때 소문자는 벡터고, 대문자는 행렬입니다.

일단 변수가 두개일 때라고 먼저 가정하고, 각 변수에대해서 편미분을한 뒤 연립방적식이 될 수 있도록 0으로 방정식을 만들어 줍니다.

두 연립방정식을 다시 풀어서 썼씁니다. 복잡해보이지만 행렬으로 위 식을 다시 표현하면.
(XTX)ˆw=XTy
이런식으로 만들 수 있습니다 ! 연립방적식을 행렬을 이용해서 풀 수 있습니다. 그럼 이런 형태로 바꾸어봅시다
우리는 X를 알고있는 상황이죠.

X는 5by2니까 XT는 2by5입니다. 그럼 곱하면 2by2가나온다. 2by2가 어떤행렬을 만족해야할까요?

X의 1열 11111111을 XT의 1행 11111111과 곱해서 갯수인 m이 나올 것이고 (여기선 5)
1,2와 2,1은 x(i)의 sum이 될 것이고 2,2는 이것의 제곱이 될 것입니다.

여기에 [[w0][w1]]을 곱하면 이렇게됩니다!
위에서도 XT를 곱했으니 반대편 항인 y에도 곱해주면 됩니다.
우리가 구하고 싶은 것은 w이므로

w에 관한 식이 나오게 됩니다! 그럼 역행렬만 구할 수 있다면 w를 구할 수 있겠죠!

역행렬 공식은 위와 같습니다.

역행렬을 구하고자하는 행렬은 다음과 같고,
Determinant를 구하면 다음과 같습니다.(ad-bc)

도출된 식을 보면 결국 모든 차의 제곱 합, 즉 분산 ! 임을 알 수 있습니다.

식을 정리하면 이렇게 됩니다. 그럼 w를 구하는 공식에 대입해보겠습니다.

결국 이렇게 구하면 된다. 그럼 2by1가 나오겠죠?
이렇게 w0과 w1을 구할 수 있습니다!

결국 우리는

이것만 알면 numpy등을 이용해서 알 수 있습니다 !

결론은 이것만 기억하시면 됩니다
정리
- 역행렬이 존재할 때 사용가능하고 (ad-bc != 0)
- 사람이 지정해주는 파라미터가 전혀없고 !
- Feature가 많을 경우 계산속도가 느려진다는 것만 단점이 있지만 너무 간편하기 때문에 많이 쓰입니다 !
in Python
수식을 그냥 컴퓨터의 언어로 풀어서 써주기만하면됩니다.
X와 y에 대한 벡터값을 받은 뒤에, 행렬 X를 만들고, X에 T, inv해줘서 수식이랑 똑같이 바꿔써주면됩니다.
클래스와 메쏘드를 사용해서 만들 수 있습니다. 싸이킷런에서도 다음과 같이 구합니다.
class LinearRegression(object):
def __init__(self, fit_intercept=True, copy_X=True):
self.fit_intercept = fit_intercept # fit_intercept는 절편값을 의미한다.
self.copy_X = copy_X # 기존에 있던 X를 복사한다. 그렇지 않으면 원본이 손상
self._coef = None
self._intercept = None
self._new_X = None
def fit(self, X, y):
pass
def predict(self, X):
reurn None
# 결과값으로 2개가 나온다.
@property # coef(계수)가 나온다. (weight들을 벡터값으로 나오게)
def coef(self):
return self._coef # hidden variable
@property
def intercept(self):
return self._intercept
클래스에서 초기화로 (self, fit_intercept, copy_X)가 들어가게됩니다.
self는 그자체고,
fit_intercept는 절편값을 의미하고
copy_X는 데이터를 복사합니다.(그렇지않으면 원본손상가능성이 있습니다.)
fit 함수에서는 fit 합니다. Normal equation을 활용해서 w값을 찾는 것입니다.
X와 y가 입력값으로 들어와서 X를 T, inv를 이용하여 y를 곱하기 전에, self._new_X에 저장시킵니다.
fit_intercept가 True일 때, y절편이 있다는 뜻이니 매트릭스 X의 0번째에 값이 1인 column vector를 추가합니다.
(y = ax + b 에서 b를 의미합니다)
참고자료
https://github.com/TEAMLAB-Lecture/AI-python-connect
TEAMLAB-Lecture/AI-python-connect
Contribute to TEAMLAB-Lecture/AI-python-connect development by creating an account on GitHub.
github.com
'인공지능 > 머신러닝' 카테고리의 다른 글
[선형회귀] Overfitting & Regulation (0) | 2021.01.27 |
---|---|
[선형회귀] Stochastic Gradient Descent (0) | 2021.01.27 |
[선형회귀] Multivariate Linear Regression (0) | 2021.01.27 |
[선형회귀] Gradient Descent (0) | 2021.01.26 |
[선형회귀] 나 다시 돌아갈래, 선형회귀 Overview (0) | 2021.01.26 |
댓글