축 $u$ 를 1차원 공간상의 정의할 때, 투영된 점은 $\hat{x}$ 으로 표기하고, PCA 신호를 $s = (s_1, s_2, ..., s_D)$ 로 표기하면, $$\hat{x} = u^T s$$ 이 되고,
이 문제는 $\hat{x}$ 의 분산을 가장 크게 하는 축(즉 단위 벡터 $u$)를 찾는 최적화 문제로 귀결된다.
다음으로 $\hat{x}$의 분산을 구해보자 $$\hat{x}_i, 1 \le i \le N의 분산, \hat{σ}^2 = \dfrac{1}{N}\sum_{i=1}^N (\hat{x}_i - \bar{\hat{x}})^2 = \dfrac{1}{N}\sum_{i=1}^N (u^T s_i - u^T \bar{s_i})^2$$
문제는 결국 $\hat{σ}^2$ 를 최대화하는 $u$를 찾는 것임
즉, 전체 문제는 위 식의 값을 최대화하는 $u$를 찾는 문제로 바뀜
위 식을 $u$로 미분해봅니다.
여기서 $\dfrac{1}{N}\sum_{i=1}^N (s_i - \bar{s})(s_i - \bar{s})^T$ 는 공분산 행렬임, 따라서 이를 $\Sigma$ 로 바꾸자 $$= 2u^T\Sigma - 2\lambda u$$
여기서 $\Sigma$ 는 대칭이므로, $u^T\Sigma$ 를 $\Sigma u$로 바꿔쓸 수 있음 $$= 2\Sigma u - 2\lambda u$$
$L(u)$ 를 최대화하는 $u$ 는 $\dfrac{\partial L(u)}{\partial u} = 0$을 만족하면 됨
따라서, 최종 식은 $$\Sigma u = \lambda u$$
여기에서 다음 정의를 확인해보자.
임의의 $n\times n$ 행렬 A에 대하여, 다음의 선형 시스템에서 0이 아닌 솔루션 벡터 K가 존재한다면 숫자 $\lambda$는 행렬 A의 고유값이다.$$AK=\lambda K$$ 이 때, 솔루션 벡터 K는 고유값 $\lambda$에 대응하는 고유 벡터 이다.
$\Sigma$ 도 $n\times n$ 행렬이므로, $u$는 $\Sigma$ 의 고유 벡터(eigenvector), $\lambda$는 $\Sigma$ 의 고유값(eigenvalue)이 됨
import numpy as np
from numpy import linalg as la
user, item = 5, 3
X = np.random.rand(user, item)
X
np.mean(X, axis=0)
X -= np.mean(X, axis=0)
X
C = np.cov(X, rowvar=False)
C
l, principal_axes = la.eig(C)
idx = l.argsort()[::-1]
l, principal_axes = l[idx], principal_axes[:, idx]
l
principal_axes
principal_axes[:, :2]
principal_components = X.dot(principal_axes)
principal_components
principal_components = X.dot(principal_axes[:, :2])
principal_components