본문 바로가기
인공지능/머신러닝

[선형회귀] Normal equation

by EXUPERY 2021. 1. 26.
반응형

 

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

 

TEAMLAB-Lecture/AI-python-connect

Contribute to TEAMLAB-Lecture/AI-python-connect development by creating an account on GitHub.

github.com

 

반응형

댓글