Normal Equation
선형회귀Linear Regression
우리는 컴퓨터에게 두가지 방법으로 Weight를 찾게 할 것입니다.
첫번째는 연립방정식(Normal Equation)을 통한 방법이고,
두번쨰는 경사하강법(Gradient Descent)을 통한 방법입니다.
지금은 연립방정식(Normal Equation)을 통한 방법을 알아보겠습니다.
Normal Equation
Normal equation은 Cost Function을 최소화하는데 그 목적이 있습니다.
왼쪽처럼 식을 작성하면 너무 복잡하고 한 눈에 보기도 힘이듭니다. 만약 행렬과 벡터로 표현한다면 식이 한번에 간단해집니다 ! (여기서 $\epsilon$는 잔차를 의미합니다.) 일반적으로 작성할 때 소문자는 벡터고, 대문자는 행렬입니다.
일단 변수가 두개일 때라고 먼저 가정하고, 각 변수에대해서 편미분을한 뒤 연립방적식이 될 수 있도록 0으로 방정식을 만들어 줍니다.
두 연립방정식을 다시 풀어서 썼씁니다. 복잡해보이지만 행렬으로 위 식을 다시 표현하면.
$(X^{T}X)\hat{w} = X^{T}y$
이런식으로 만들 수 있습니다 ! 연립방적식을 행렬을 이용해서 풀 수 있습니다. 그럼 이런 형태로 바꾸어봅시다
우리는 X를 알고있는 상황이죠.
$X$는 5by2니까 $X^T$는 2by5입니다. 그럼 곱하면 2by2가나온다. 2by2가 어떤행렬을 만족해야할까요?
$X$의 1열 11111111을 $X^{T}$의 1행 11111111과 곱해서 갯수인 m이 나올 것이고 (여기선 5)
1,2와 2,1은 x(i)의 sum이 될 것이고 2,2는 이것의 제곱이 될 것입니다.
여기에 [[w0][w1]]을 곱하면 이렇게됩니다!
위에서도 $X^{T}$를 곱했으니 반대편 항인 $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
'인공지능 > 머신러닝' 카테고리의 다른 글
[선형회귀] 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 |
댓글