문제 정의

데이터의 차원을 줄인다는 것은 정보를 무작정 버리는 일이 아니다. PCA(Principal Component Analysis)는 여러 방향 가운데 데이터가 가장 많이 퍼져 있는 방향을 먼저 선택한다. 이 방향으로 데이터를 사영했을 때 원래 데이터의 구조를 가장 많이 보존할 가능성이 높기 때문이다.

관측치 xiRp\mathbf{x}_i \in \mathbb{R}^p가 있고 평균 중심화를 마쳤다고 하자. 단위 벡터 w\mathbf{w}에 대한 관측치의 사영은 zi=wTxiz_i = \mathbf{w}^T\mathbf{x}_i다.

분산이 왜 중요한가

사영된 값 zz의 분산은 다음처럼 쓸 수 있다.

Var(z)=Var(wTx)=wTΣw\mathrm{Var}(z) = \mathrm{Var}(\mathbf{w}^T\mathbf{x}) = \mathbf{w}^T\Sigma\mathbf{w}

따라서 첫 번째 주성분을 구하는 문제는 분산을 최대화하는 방향을 찾는 문제다.

maxwwTΣws.t.w2=1\max_{\mathbf{w}} \mathbf{w}^T \Sigma \mathbf{w} \quad \text{s.t.} \quad \|\mathbf{w}\|_2 = 1

제약 조건이 없다면 w\mathbf{w}의 크기만 키워 목적함수를 무한히 증가시킬 수 있으므로 단위 벡터 제약이 필요하다.

최적화 문제에서 고유값 문제로

라그랑주 승수 λ\lambda를 도입한다.

L(w,λ)=wTΣwλ(wTw1)\mathcal{L}(\mathbf{w}, \lambda) = \mathbf{w}^T\Sigma\mathbf{w} - \lambda(\mathbf{w}^T\mathbf{w}-1)

w\mathbf{w}에 대해 미분하면 Σw=λw\Sigma\mathbf{w}=\lambda\mathbf{w}를 얻는다. 즉, 최적 방향은 공분산 행렬의 고유벡터이며 해당 방향의 분산은 고유값이다. 가장 큰 고유값에 대응하는 고유벡터가 첫 번째 주성분이 된다.

기하학적 해석

공분산 행렬은 데이터 구름의 타원체 모양을 결정한다. 고유벡터는 타원체의 축이고, 고유값은 각 축 방향으로 퍼진 정도다. PCA는 가장 긴 축부터 좌표축으로 삼는다.

개념PCA에서의 의미
고유벡터새로운 좌표축의 방향
고유값그 축이 설명하는 분산
설명 분산 비율전체 분산 중 해당 축의 비중

Python으로 확인하기

from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

X_scaled = StandardScaler().fit_transform(X)
pca = PCA(n_components=2)
X_transformed = pca.fit_transform(X_scaled)

print(pca.explained_variance_ratio_)

explained_variance_ratio_의 누적합을 보면 선택한 주성분이 전체 분산을 얼마나 설명하는지 확인할 수 있다.

언제 사용하면 안 되는가

PCA가 항상 좋은 전처리는 아니다.

  1. 분산이 큰 방향이 예측에 중요한 방향이라는 보장이 없을 때
  2. 변수의 의미와 해석 가능성이 중요한 문제일 때
  3. 데이터 구조가 강하게 비선형일 때
  4. 스케일 차이가 의미를 가지는데 무심코 표준화했을 때

정리

PCA의 핵심은 “차원을 줄인다”보다 “공분산 구조가 가장 잘 드러나는 직교 좌표계를 찾는다”에 가깝다. 최적화 문제와 고유값 문제의 연결을 이해하면 주성분 개수, 스케일링, 해석 가능성을 더 의식적으로 판단할 수 있다.1

Footnotes

  1. 표본 공분산 행렬의 분모를 nn으로 둘지 n1n-1로 둘지는 고유벡터의 방향에는 영향을 주지 않는다.