정규 방정식 구현하기

파이썬으로 정규방정식을 구현하는 아이디어를 살펴보자.

먼저, X와 y를 입력으로 받아서 크기를 조정해준다.

def fit(self, X, y):
    self._new_X = np.array(X)
    y = y.reshape(-1, 1)

그리고 상수항(절편)에 해당하는 벡터를 만들어준다. 이 벡터는 당연히 X에 합쳐야(concatenate) 한다.

if self.fit_intercept:
    intercept_vector = np.ones([len(sefl._new_X), 1])
    self._new_X = np.concatenate(
      [intercept_vector, self._new_X], axis=1)

이제 정규방정식으로 가중치 행렬을 만들어 주자. 마지막에 flatten()를 이용해 1차원으로 바꾸어 준다.

weights = np.dot(np.linalg.inv(
  np.dot(self._new_X.T, self._new_X)), 
  self._new_X.T).dot(y).flatten()

좀 복잡해 보이지만 지난 시간에 강조한 정규방정식을 구현한 것이다.

\[\hat{w} = (X^{T}X)^{-1}X^{T}y\]

이렇게 구한 가중치 행렬을 각 변수에 할당해주면 된다.


선형 회귀 모델을 이용해서 예측값 구하기

예측값을 구하는 과정은 매우 간단하다. 아래 과정을 구현하면 끝이다.


def predict(self, X):
    test_X = np.array(X)

    if self.fit_intercept:
        intercept_vector = np.ones([len(test_X), 1])
        test_X = np.concatenate([
          intercept_vector, test_X], axis=1)

        weights = np.concatenate([
          self.intercept], self._coef, axis = 0)
    
    else:
        weights = self._coef
    
    return test_X.dot(weights)

나머지 부분은 앞서 살펴본 정규 방정식 과정과 유사하고, 마지막 리턴 값이 이 코드의 핵심이다.


전체 코드 보러가기



별도의 출처 표시가 있는 이미지를 제외한 모든 이미지는 강의자료에서 발췌하였음을 밝힙니다.

댓글남기기