주성분 분석(PCA, Principal Component Analysis)은 고차원 데이터의 분산을 최대한 보존하면서 차원을 축소하는 기법이다. 데이터의 주요 패턴을 담은 주성분(Principal Component)을 찾아 저차원 공간으로 투영한다.
수학적 배경
1. 데이터 중심화 (평균 빼기)
2. 공분산 행렬 계산: C = (1/n) X^T X
3. 고유값 분해: C = V Λ V^T
V: 고유벡터 (주성분 방향)
Λ: 고유값 (분산 크기)
4. 고유값 내림차순으로 k개 선택
5. 데이터를 k개 주성분으로 투영
구현
python
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
import numpy as np
# 전처리: 스케일 통일 (PCA 전 필수)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# PCA
pca = PCA(n_components=2) # 2차원으로 축소
X_pca = pca.fit_transform(X_scaled)
print("설명 분산 비율:", pca.explained_variance_ratio_)
# [0.45, 0.30] → PC1이 45%, PC2가 30% 분산 설명
print("누적 분산:", pca.explained_variance_ratio_.cumsum())
# [0.45, 0.75] → 2개로 75% 정보 보존
# 적절한 n_components 선택
pca_full = PCA()
pca_full.fit(X_scaled)
# cumsum이 95%가 되는 지점의 k 선택
시각화 활용
고차원 데이터(수백 특성)를 2~3차원으로 줄여 시각화. MNIST 필기 숫자, 유전자 발현 데이터 등에서 클러스터 패턴 확인.
PCA vs t-SNE vs UMAP
| 항목 | PCA | t-SNE | UMAP |
|---|
| 선형성 | 선형 | 비선형 | 비선형 |
| 속도 | 빠름 | 느림 | 중간 |
| 전역 구조 | 보존 | 일부 손실 | 보존 |
| 새 데이터 | transform 가능 | 어려움 | 가능 |
관련 개념