<최소제곱법 (Least Square Method)>
1. 일반적인 접근
앞서 알아본 단순선형회귀보다 더 일반적인 다중선형회귀 모델을 만들어서 생각해보자. 지난번과 마찬가지로 $n$개의 데이터 세트를 가지는 $m$개의 입력 변수 $f_i^{(j)}$와 출력 $y_i$가 있다. 단, $(i = 1, 2, ..., n), (j = 1, 2, ..., m)$
$$ y^e(\boldsymbol{x}) = b_j(\boldsymbol{x})c^j $$
여기서 $ y^e $는 모델의 출력이고, $c$는 계수 벡터, $b$는 기저 벡터(basis vector)라고 하며 아래와 같다. 여기서 $f^{(j)}$는 $j$번째 변수(variable, predictor)를 의미한다.
$$
b = [1, f^{(1)}(\boldsymbol{x}), f^{(2)}(\boldsymbol{x}), \cdots, f^{(m)}(\boldsymbol{x})] \\
c = [c_0, c_1, c_2, \cdots, c_m]^T
$$
일반적으로 보면 각 항이 하나의 독립된 함수라고 생각하면 된다. 예를 들어 여기서 기저벡터 $[1, f^{(1)}, f^{(2)}, \cdots, f^{(m)}]$를 제곱항 $[1, x, x^2, \cdots, x^m]$로 두고 하나의 입력 변수 $x$만 두면 $x$의 $m$차 다항식 근사를 하는 것이 된다. 모델이 함수를 포함하는 것을 수식에 표현하면 괜히 복잡해고 summation 어쩌구 저쩌구해서 유도하려면 너무 피곤하니까 이후로는 각 항은 함수 형태 대신 $x^{(j)}$형태로 쓰고 계수 벡터는 $\boldsymbol{c}$ 대신 미지수라는 의미로 $\boldsymbol{x}$로 쓴다.
데이터 세트 $\boldsymbol{A}$와 계수 벡터 $\boldsymbol{x}$로 모델을 표현해보면 $\boldsymbol{y}^e = \boldsymbol{Ax}$ 처럼 쓸 수 있다. 따라서 행렬을 이용해 표현하면 아래와 같다.
$$
\begin{bmatrix}
y_1^e \\
y_2^e \\
\vdots \\
y_m^e
\end{bmatrix}
=
\begin{bmatrix}
1 & x_1^{(1)} & x_1^{(2)} & \cdots & x_1^{(m)} \\
1 & x_2^{(1)} & x_2^{(2)} & \cdots & x_2^{(m)} \\
1 & \vdots & \vdots & \ddots & \vdots \\
1 & x_n^{(1)} & x_n^{(2)} & \cdots & x_n^{(m)} \\
\end{bmatrix}_\boldsymbol{(n \times m)}
\begin{bmatrix}
c_0 \\
c_1 \\
c_2 \\
\vdots \\
c_m
\end{bmatrix}
$$
오차 함수는 모든 데이터 세트 오차 제곱의 합이므로 아래와 같이 쓸 수 있다.
\begin{align}
E &=
\sum\limits_{i=1}^n(y_i^e - y_i)^2
\\
&=
\begin{Vmatrix}
\boldsymbol{y}^e-\boldsymbol{y}
\end{Vmatrix}^2
\\
&=
\begin{Vmatrix}
\boldsymbol{Ax}-\boldsymbol{y}
\end{Vmatrix}^2
\end{align}
위 식에서 $ \begin{Vmatrix} \boldsymbol{Ax}-\boldsymbol{y} \end{Vmatrix}$는 L2-norm이다. 이 식을 다시 써보면 벡터 요소 제곱의 합은 전치와의 곱이므로,
$$
\begin{align}
E &= (\boldsymbol{Ax}-\boldsymbol{y})^T(\boldsymbol{Ax}-\boldsymbol{y}) \\
&= (\boldsymbol{x^TA^T}-\boldsymbol{y}^T)(\boldsymbol{Ax}-\boldsymbol{y}) \\
&= \boldsymbol{x^TA^TAx}-\boldsymbol{y^TAx} - \boldsymbol{x^TA^Ty} + \boldsymbol{y}^T\boldsymbol{y}
\end{align}
$$
이제 미지수 $\boldsymbol{x}$에대해 미분해 0이 되는 $\boldsymbol{x}$를 찾아보면,
\begin{align}
\cfrac{dE}{d\boldsymbol{x}} = 2\boldsymbol{A}^{\mathsf{T}}\boldsymbol{A}x - 2\boldsymbol{A}^{\mathsf{T}}\boldsymbol{y} = 0
\end{align}
위 식을 정리하면
$$
\boldsymbol{A}^{\mathsf{T}}\boldsymbol{A}x = \boldsymbol{A}^{\mathsf{T}}\boldsymbol{y}
$$
따라서 x는 다음과 같이 구할 수 있다.
$$
\boldsymbol{x} = \boldsymbol{A}^{\mathsf{T}}\boldsymbol{A}\boldsymbol{A}^{\mathsf{T}}\boldsymbol{y}
$$
2. 더 간단한 접근
이제 모든 유도가 끝났다. 앞으로는 데이터 세트로 입력 $\boldsymbol{A}$와 출력 $\boldsymbol{y}$가 있으면 다음을 만족하는 계수 벡터 $\boldsymbol{x}$를 구하면 그만이다.
$$
\boldsymbol{Ax} - \boldsymbol{y} = 0
$$
그럼 단순히 $\boldsymbol{x} = \boldsymbol{A^{-1}y}$로 구하면 될 것 같지만 안 된다. 왜냐하면 $\boldsymbol{A}$의 크기가 $(n \times m)$으로 정방행렬이 아니기 때문이다. 따라서 아래와 같이 약간의 트릭을 써서 $\boldsymbol{x}$를 구한다. $\boldsymbol{A^TA}$와 같이 $\boldsymbol{A}$의 전치행렬을 곱해 정방행렬로 바꿔서 역행렬을 구하는 것을 알 수 있다.
$$
\boldsymbol{Ax} = \boldsymbol{y} \\
\boldsymbol{A}^{\mathsf{T}}\boldsymbol{Ax} = \boldsymbol{A}^{\mathsf{T}}\boldsymbol{y} \\
(\boldsymbol{A}^{\mathsf{T}}\boldsymbol{A})^{-1}\boldsymbol{A}^{\mathsf{T}}\boldsymbol{Ax} = (\boldsymbol{A}^{\mathsf{T}}\boldsymbol{A})^{-1}\boldsymbol{A}^{\mathsf{T}}\boldsymbol{y}
$$
따라서 구하고자 하는 계수 벡터 $\boldsymbol{x}$는 다음과 같다.
$$
\boldsymbol{x} = (\boldsymbol{A}^{\mathsf{T}}\boldsymbol{A})^{-1}\boldsymbol{A}^{\mathsf{T}}\boldsymbol{y} \\
$$
설명했듯 역행렬을 다소 복잡하게 $(\boldsymbol{A}^{\mathsf{T}}\boldsymbol{A})^{-1}$로 구하는 이유는 $\boldsymbol{A}$가 정방행렬이 아니어서 역행렬을 직접 구할 수 없기 때문이다. 따라서 위와 같은 형태의 행렬을 구하고 마치 역행렬처럼 사용하게 된다. 이것을 유사 역행렬 또는 의사 역행렬(pseudo inverse)라고 하며 Matlab이나 Python의 numpy 등 수학 라이브러리에서는 이런 의사 역행렬을 pinv와 같은 함수로 제공한다.
여기에서 $\boldsymbol{x, y}$가 오차를 포함한 관측값이기도 하고 어차피 미지수의 수와 방정식의 수가 일치하지도 않는 연립방정식 $\boldsymbol{Ax} = \boldsymbol{y}$를 풀어봐야 해가 안나오는 것이 당연하다. 신기한 것은 엄밀하게는 풀어지지도 않을 것처럼 보이는 이 연립방정식을 억지로 풀어 보면 그래도 제일 잘 들어 맞는 관계식을 준다는 것이다. 쉽게 보일 수도 있지만 머리가 나쁜 공대생은 다시 봐도 오묘하고 재미있다.
<최소제곱법 (Least Square Method)>
최근댓글