Probabilistic PCA
이 포스팅은 Probabilistic Principal Component Analysis (PPCA)에 대해 공부하며 정리한 글입니다.
Tipping & Bishop (1999)의 고전 논문을 기반으로 수학적 정의, 추론 과정, 장단점을 설명하겠습니다.
Background
- PCA는 데이터의 공분산 행렬을 고유분해하여 저차원 공간으로 투영하는 선형 차원축소 기법입니다.
- 하지만 PCA는 선형 대수적 접근일 뿐, 확률 모델로 정의되지 않습니다.
- 따라서
- 불확실성을 추정 할 수 없고
- 결측치(missing data) 처리가 불가능하며
- 다른 확률적 모델과의 통합이 어렵다는 단점이 존재합니다.
이를 해결하기 위해 PCA를 확률적 생성 모델로 재해석한 것이 PPCA입니다.
TL;DR - Easy Analogy
-
데이터를 “풍선”이라고 생각해보면
-
풍선은 몇몇 축으로 크게 부풀고(=주성분), 나머지는 그냥 대충 동그란 모양(=노이즈).
-
PCA는 “풍선이 어디로 제일 늘어났는지” 만 보는 거고,
-
PPCA는 “풍선이 늘어난 부분 + 바탕에 깔린 동그란 바람(노이즈)” 까지 모델링하는 거라고 생각할 수 있습니다!
Model Definition
PPCA는 잠재변수 모형(latent variable model)로 정의됩니다. 즉, 데이터는 숨겨진 저차원 변수로부터 생성된다고 가정합니다.
\[x = W z + \mu + \epsilon\]- $x \in \mathbb{R}^d$: 관측 벡터
- $z \in \mathbb{R}^q$: 잠재 벡터 ($q \ll d$)
- $W \in \mathbb{R}^{d \times q}$: 로딩 행렬
- $\mu \in \mathbb{R}^d$: 평균 벡터
- $\epsilon \sim \mathcal{N}(0, \sigma^2 I_d)$: 등방성 가우시안 노이즈
- $z \sim \mathcal{N}(0, I_q)$: 표준 정규 분포
따라서 주변 분포는 다음과 같습니다.
\[x \sim \mathcal{N}(\mu, W W^\top + \sigma^2 I_d)\]즉 PCA가 찾는 저차원 공간을 확률적 생성 모델로 정의한 것이 PPCA입니다.
Parameter Estimation
목표는 $W, \mu, \sigma^2$를 학습하는 것입니다. 데이터 로그가능도를 최대화하여 추정합니다.
Two Approaches
-
Closed-form MLE
표본 공분산 $S$를 고유분해하여 최대우도해를 직접 구할 수 있습니다. 이 경우 $W$는 PCA의 주성분 방향과 일치하며, $\sigma^2$는 잔여 잡음 분산으로 추정됩니다. -
EM Algorithm
숨겨진 변수 $z$를 도입하여 EM(Expectation–Maximization) 알고리즘으로 추정할 수 있습니다. 이는 결측치가 있는 경우나 대규모 데이터 처리에 유리합니다.
Closed-form MLE (Derivation Sketch)
생성 모델 $x \sim \mathcal{N}(\mu, C),\ C = W W^\top + \sigma^2 I$에서 로그가능도는
\[\mathcal{L}(W,\sigma^2) = -\tfrac{N}{2}\{\log|C| + \mathrm{tr}(C^{-1}S)\} + \text{const},\quad S = \tfrac{1}{N}\sum_n (x_n-\bar x)(x_n-\bar x)^\top\]입니다. $S = U \Lambda U^\top$로 고유분해하고, $W = U A R$로 두면 목적함수는 축별로 분리됩니다. 계산을 통해
\[a_i^2 = \lambda_i - \sigma^2 \quad (i \le q), \qquad \hat\sigma^2 = \frac{1}{d-q}\sum_{i=q+1}^d \lambda_i\]가 유도됩니다. 따라서 최종 해는
\[\hat W = U_q (\Lambda_q - \hat\sigma^2 I_q)^{1/2} R,\quad \hat\mu = \bar x\]입니다. 여기서 $R$은 임의의 직교행렬로, 회전 불식별성을 나타냅니다.
EM Algorithm (Update Equations)
EM에서는 숨겨진 변수 $z$의 사후분포를 활용합니다.
E-step
$M = W^\top W + \sigma^2 I_q$라 하면,
M-step
집계량을 $S_{xz} = \tfrac{1}{N}\sum (x_n-\mu)\mathbb{E}[z_n]^\top,\
S_{zz} = \tfrac{1}{N}\sum \mathbb{E}[z_n z_n^\top]$라 하면,
으로 업데이트합니다. 수렴 시 해는 Closed-form과 일치합니다.
Relation to PCA
- PPCA에서 $\hat W$는 PCA의 주성분 벡터와 동일합니다.
- 따라서 PPCA는 PCA의 확률적 일반화로 해석됩니다.
- 차이점은 PPCA가 공분산에 등방성 잡음을 포함시켜 불확실성을 모델링한다는 점입니다.
- 직관적으로, 큰 고유값 방향은 잠재 변수 $z$로 설명되고, 작은 고유값은 잡음 $\sigma^2$로 흡수됩니다.
Experiments
간단한 PPCA의 시각화입니다. 파란점들이 데이터이며, 두 개의 직선이 PPCA가 찾은 주성분 방향을 의미합니다. 중심의 구는 PPCA를 통해 추정한 등방 노이즈 영역을 의미합니다.
import numpy as np
import matplotlib.pyplot as plt
# ----- 1. 데이터 생성 (3D, 잠재 2D + 등방성 노이즈) -----
np.random.seed(0)
N = 500
d, q = 3, 2
# True 파라미터
mu_true = np.array([0.0, 0.0, 0.0])
W_true = np.array([[2.5, 0.0],
[0.0, 1.5],
[0.0, 0.0]])
sigma2_true = 0.5
# 잠재변수 z
Z = np.random.randn(q, N)
# 데이터 생성
X = (W_true @ Z + mu_true.reshape(-1,1) +
np.sqrt(sigma2_true) * np.random.randn(d, N))
# ----- 2. PCA (고유분해) -----
S = np.cov(X)
eigvals, eigvecs = np.linalg.eigh(S)
order = np.argsort(eigvals)[::-1]
eigvals, eigvecs = eigvals[order], eigvecs[:, order]
Uq = eigvecs[:, :q]
# ----- 3. 구(노이즈) 좌표 -----
phi, theta = np.mgrid[0:np.pi:30j, 0:2*np.pi:30j]
r = np.sqrt(sigma2_true)
xs = r*np.sin(phi)*np.cos(theta) + mu_true[0]
ys = r*np.sin(phi)*np.sin(theta) + mu_true[1]
zs = r*np.cos(phi) + mu_true[2]
# ----- 4. Helper: equal axis ratio -----
def set_axes_equal(ax):
"""Set 3D plot axes to equal scale."""
x_limits = ax.get_xlim3d()
y_limits = ax.get_ylim3d()
z_limits = ax.get_zlim3d()
x_range = abs(x_limits[1] - x_limits[0])
x_middle = np.mean(x_limits)
y_range = abs(y_limits[1] - y_limits[0])
y_middle = np.mean(y_limits)
z_range = abs(z_limits[1] - z_limits[0])
z_middle = np.mean(z_limits)
plot_radius = 0.5*max([x_range, y_range, z_range])
ax.set_xlim3d([x_middle - plot_radius, x_middle + plot_radius])
ax.set_ylim3d([y_middle - plot_radius, y_middle + plot_radius])
ax.set_zlim3d([z_middle - plot_radius, z_middle + plot_radius])
# ----- 5. 시각화 -----
fig = plt.figure(figsize=(8,6))
ax = fig.add_subplot(111, projection='3d')
# 데이터 (투명하게)
ax.scatter(X[0], X[1], X[2], alpha=0.05, color="blue")
# 평균
ax.scatter(*mu_true, color='red', s=100, label="mean")
# 주성분 축
for i in range(q):
vec = Uq[:, i]
line = np.array([mu_true - 4*vec, mu_true + 4*vec])
ax.plot(line[:,0], line[:,1], line[:,2], lw=3, color="black", label=f"axis {i+1}")
# 노이즈 구
ax.plot_surface(xs, ys, zs, color='orange', alpha=0.3, linewidth=0)
set_axes_equal(ax)
ax.set_title("PPCA: principal axes + isotropic noise sphere")
ax.legend()
plt.show()
Advantages
- 결측치 처리 용이 (EM으로 결측치를 추론하며 학습 가능)
- 불확실성 추정 가능 (분포적 정의 덕분에 신뢰구간 제공 가능)
Data Reconstruction
PPCA는 단순히 차원축소에만 쓰이는 것이 아니라, 결측치나 손실된 데이터를 복원하는 데도 활용할 수 있습니다.
EM 알고리즘을 사용하면, E-step에서 잠재변수 $z$의 사후분포를 추정하는 과정에서 누락된 성분을 기대값으로 대체할 수 있습니다.
따라서 부분적으로 관측된 데이터 행렬을 입력해도, 학습 과정에서 누락값이 점차 복원됩니다.
실험적으로는 다음과 같은 흐름으로 작동합니다.
- 데이터 일부 성분을 결측 처리 (예: 센서 오류로 일부 값이 없음)
- PPCA EM 학습 → 잠재구조($W, z, \sigma^2$) 추정
- 학습 도중에 결측치가 $Wz + \mu$ 형태로 복원됨
- 결과적으로 원래 데이터와 유사한 값이 재구성됨
Conclusion
PPCA는 PCA를 확률적 생성 모델로 재해석한 기법입니다.
PCA의 주성분 방향을 그대로 유지하면서도 결측치 처리, 불확실성 추정, Bayesian 확장 같은 추가적 장점을 제공합니다.
댓글남기기