基础 · 03

主成分分析

PCA 把高维数据投到方差最大的几个方向上——用协方差矩阵的特征值分解一步到位。从直觉到推导到 SVD 的关系,一篇讲透降维。

10 min read

基本想法:找方差最大的方向

假设你有一团高维数据——比如 100 维的用户行为向量。你想「看一看」它的结构,但人眼只能看 2D 或 3D。问题是:投影到哪个方向,信息丢得最少?

PCA 的回答很直接:选数据散布最广(方差最大)的方向。方差大 = 数据在这个方向上差异大 = 信息量大。如果某个方向方差接近零,说明所有数据点在这个维度几乎一样——丢掉也不影响分辨力。

几何直觉:一团数据在高维空间形成一个"椭球"。PCA 就是找到这个椭球的长轴方向——先找最长的那根轴(PC1),再找与它垂直的次长轴(PC2),依此类推。

PC1PC2

方差解释比

PC185.8%
PC214.2%
PC1:最大方差方向(协方差矩阵最大特征值对应的特征向量)
PC2:与 PC1 正交的剩余方差方向
点击「投影」将所有点压到 PC1 轴上——降维
PCA 找到数据散布最广的方向(PC1),投影后只保留这个方向的信息——用一个维度捕获了 85.8% 的总方差。

数学推导:协方差矩阵的特征值分解

nn 个样本 x1,,xnRd\mathbf{x}_1, \ldots, \mathbf{x}_n \in \mathbb{R}^d,已中心化(均值为零)。我们要找一个单位向量 w\mathbf{w} 使投影后的方差最大。

投影后的方差:

Var=1ni=1n(wxi)2=w(1nixixi)w=wΣw\text{Var} = \frac{1}{n} \sum_{i=1}^{n} (\mathbf{w}^\top \mathbf{x}_i)^2 = \mathbf{w}^\top \left( \frac{1}{n} \sum_i \mathbf{x}_i \mathbf{x}_i^\top \right) \mathbf{w} = \mathbf{w}^\top \Sigma\, \mathbf{w}

其中 Σ=1nXX\Sigma = \frac{1}{n} X^\top X样本协方差矩阵d×dd \times d,对称半正定)。

第一主成分就是如下优化问题的解:

maxw  wΣws.t.w=1\max_{\mathbf{w}} \; \mathbf{w}^\top \Sigma\, \mathbf{w} \quad \text{s.t.} \quad \|\mathbf{w}\| = 1

用拉格朗日乘子法:w[wΣwλ(ww1)]=0\nabla_\mathbf{w} [\mathbf{w}^\top \Sigma \mathbf{w} - \lambda(\mathbf{w}^\top \mathbf{w} - 1)] = 0,得到:

Σw=λw\Sigma\, \mathbf{w} = \lambda\, \mathbf{w}

这正是特征值方程!最大化目标值 wΣw=λ\mathbf{w}^\top \Sigma \mathbf{w} = \lambda,所以第一主成分对应 Σ\Sigma最大特征值 λ1\lambda_1 及其特征向量 w1\mathbf{w}_1

kk 个主成分:取 Σ\Sigma 最大的 kk 个特征值 λ1λ2λk\lambda_1 \geq \lambda_2 \geq \cdots \geq \lambda_k 对应的特征向量 w1,,wk\mathbf{w}_1, \ldots, \mathbf{w}_k。由于 Σ\Sigma 对称,这些特征向量两两正交——它们构成降维子空间的正交基。

降维投影:将 dd 维数据投到这 kk 个方向上:

zi=WkxiRk,Wk=[w1,,wk]\mathbf{z}_i = W_k^\top \mathbf{x}_i \in \mathbb{R}^k, \quad W_k = [\mathbf{w}_1, \ldots, \mathbf{w}_k]

方差解释比

每个主成分捕获多少信息?第 kk 个主成分解释的方差占比为:

ρk=λki=1dλi\rho_k = \frac{\lambda_k}{\sum_{i=1}^{d} \lambda_i}

kk 个主成分的累积方差解释比

R(k)=i=1kλii=1dλiR(k) = \frac{\sum_{i=1}^{k} \lambda_i}{\sum_{i=1}^{d} \lambda_i}

实际中常选 kk 使 R(k)0.95R(k) \geq 0.95——保留 95% 的方差。这是 PCA 降维中最常用的选择准则。

例如上面的 2D 演示里,PC1 一个方向就解释了约 93% 的方差,说明数据几乎是一维的——沿 PC1 排列,PC2 方向只有噪声级别的波动。

PCA 与 SVD 的关系

对中心化数据矩阵 XRn×dX \in \mathbb{R}^{n \times d}(每行一个样本)做 SVD:

X=UΣVX = U \Sigma V^\top

其中 URn×nU \in \mathbb{R}^{n \times n} 正交,Σ\Sigma 是对角矩阵(奇异值),VRd×dV \in \mathbb{R}^{d \times d} 正交。

协方差矩阵:

1nXX=1nVΣUUΣV=V(Σ2n)V\frac{1}{n} X^\top X = \frac{1}{n} V \Sigma^\top U^\top U \Sigma V^\top = V \left( \frac{\Sigma^2}{n} \right) V^\top

对比 Σcov=VΛV\Sigma_{\text{cov}} = V \Lambda V^\top(特征值分解),我们得到:

  • VV 的列就是主成分方向(即 Σcov\Sigma_{\text{cov}} 的特征向量)
  • 特征值 λi=σi2/n\lambda_i = \sigma_i^2 / n(奇异值的平方除以样本数)
  • XV=UΣXV = U\Sigma 的前 kk 列就是降维后的坐标

实际中 sklearn.decomposition.PCA 内部就是对 XX 做 SVD(而非直接求协方差矩阵的特征值),因为 SVD 在数值上更稳定,而且当 n<dn < d 时更高效。

降维应用

高维数据可视化:把 784 维的 MNIST 手写数字投到 2D(取前两个主成分),不同数字自然聚成簇——不需要训练任何模型就能"看见"结构。

去噪:信号通常在前几个主成分上,噪声分散在所有方向。只保留前 kk 个主成分再重建:

x^=WkWkx\hat{\mathbf{x}} = W_k W_k^\top \mathbf{x}

就等于把小方差方向(噪声)砍掉了。

特征预处理:高维特征(如 NLP 的词频向量)先做 PCA 降到合理维度,再送入下游模型——既加速训练,又减少过拟合。

局限性:PCA 只能发现线性结构。如果数据呈弯曲流形(如"瑞士卷"),线性投影会把不同区域叠在一起。此时需要 t-SNE、UMAP 等非线性降维方法。

这个想法在前沿里