假设你有一团高维数据——比如 100 维的用户行为向量。你想「看一看」它的结构,但人眼只能看 2D 或 3D。问题是:投影到哪个方向,信息丢得最少?
PCA 的回答很直接:选数据散布最广(方差最大)的方向。方差大 = 数据在这个方向上差异大 = 信息量大。如果某个方向方差接近零,说明所有数据点在这个维度几乎一样——丢掉也不影响分辨力。
几何直觉:一团数据在高维空间形成一个"椭球"。PCA 就是找到这个椭球的长轴方向——先找最长的那根轴(PC1),再找与它垂直的次长轴(PC2),依此类推。
PC1:最大方差方向(协方差矩阵最大特征值对应的特征向量)
PC2:与 PC1 正交的剩余方差方向
点击「投影」将所有点压到 PC1 轴上——降维
PCA 找到数据散布最广的方向(PC1),投影后只保留这个方向的信息——用一个维度捕获了 85.8% 的总方差。
设 n 个样本 x1,…,xn∈Rd,已中心化(均值为零)。我们要找一个单位向量 w 使投影后的方差最大。
投影后的方差:
Var=n1i=1∑n(w⊤xi)2=w⊤(n1i∑xixi⊤)w=w⊤Σw
其中 Σ=n1X⊤X 是样本协方差矩阵(d×d,对称半正定)。
第一主成分就是如下优化问题的解:
wmaxw⊤Σws.t.∥w∥=1
用拉格朗日乘子法:∇w[w⊤Σw−λ(w⊤w−1)]=0,得到:
Σw=λw
这正是特征值方程!最大化目标值 w⊤Σw=λ,所以第一主成分对应 Σ 的最大特征值 λ1 及其特征向量 w1。
前 k 个主成分:取 Σ 最大的 k 个特征值 λ1≥λ2≥⋯≥λk 对应的特征向量 w1,…,wk。由于 Σ 对称,这些特征向量两两正交——它们构成降维子空间的正交基。
降维投影:将 d 维数据投到这 k 个方向上:
zi=Wk⊤xi∈Rk,Wk=[w1,…,wk]
每个主成分捕获多少信息?第 k 个主成分解释的方差占比为:
ρk=∑i=1dλiλk
前 k 个主成分的累积方差解释比:
R(k)=∑i=1dλi∑i=1kλi
实际中常选 k 使 R(k)≥0.95——保留 95% 的方差。这是 PCA 降维中最常用的选择准则。
例如上面的 2D 演示里,PC1 一个方向就解释了约 93% 的方差,说明数据几乎是一维的——沿 PC1 排列,PC2 方向只有噪声级别的波动。
对中心化数据矩阵 X∈Rn×d(每行一个样本)做 SVD:
X=UΣV⊤
其中 U∈Rn×n 正交,Σ 是对角矩阵(奇异值),V∈Rd×d 正交。
协方差矩阵:
n1X⊤X=n1VΣ⊤U⊤UΣV⊤=V(nΣ2)V⊤
对比 Σcov=VΛV⊤(特征值分解),我们得到:
- V 的列就是主成分方向(即 Σcov 的特征向量)
- 特征值 λi=σi2/n(奇异值的平方除以样本数)
- XV=UΣ 的前 k 列就是降维后的坐标
实际中 sklearn.decomposition.PCA 内部就是对 X 做 SVD(而非直接求协方差矩阵的特征值),因为 SVD 在数值上更稳定,而且当 n<d 时更高效。
高维数据可视化:把 784 维的 MNIST 手写数字投到 2D(取前两个主成分),不同数字自然聚成簇——不需要训练任何模型就能"看见"结构。
去噪:信号通常在前几个主成分上,噪声分散在所有方向。只保留前 k 个主成分再重建:
x^=WkWk⊤x
就等于把小方差方向(噪声)砍掉了。
特征预处理:高维特征(如 NLP 的词频向量)先做 PCA 降到合理维度,再送入下游模型——既加速训练,又减少过拟合。
局限性:PCA 只能发现线性结构。如果数据呈弯曲流形(如"瑞士卷"),线性投影会把不同区域叠在一起。此时需要 t-SNE、UMAP 等非线性降维方法。