2775 字
14 分钟
主成分分析
2026-10-12
2026-10-13

前言#

特征多而冗余时,把输入压到少数几个方向能省存储和算力,也常常顺手削掉噪声;想知道高维样本长什么样,压到两维、三维就能直接画出来观察类别结构。降维在 AI 里几乎无处不在。

具体怎么做?EP.0把降维看成往少数方向投影,留下了”选哪些方向”的问题;上一篇的 SVD 给出了一半答案:任意矩阵沿正交方向的变化有大有小,留下前 kk 个就是最优的秩 kk 近似。但把它直接用到真实数据上,还差一步:我们投影所用的子空间必须经过原点,而数据团的中心通常不在那里。补上这一步,就是主成分分析,Principal Component Analysis,简称 PCA。

数据中心化#

过原点的子空间#

低秩近似把数据投影到 kk 个正交方向 w1,…,wkw_1,\ldots,w_k 张成的子空间上。子空间是线性结构,必过原点。真实数据不满足这一点:MNIST 的像素值全部非负,整团数据悬在空间的角落,离原点很远。

这时若仍要求投影方向过原点,第一条方向几乎只能指向数据团的中心,它先花掉一个成分去回答”数据在哪里”,而不是”数据怎样变化”。虚线标出数据真正的延展方向,和被迫过原点的直线并不重合:

过原点的直线被数据中心带偏,中心化后才对准延展方向

均值平移#

解决方式也直接:先算经验均值

xˉ=1n∑i=1nxi∈Rd,\bar{x}=\frac{1}{n}\sum_{i=1}^{n}x_i\in\mathbb{R}^{d},

再把每个样本减去它,得到中心化的数据矩阵

Xc=[x1−xˉx2−xˉ⋯xn−xˉ]∈Rd×n.X_c=\begin{bmatrix}x_1-\bar{x}&x_2-\bar{x}&\cdots&x_n-\bar{x}\end{bmatrix}\in\mathbb{R}^{d\times n}.

数据中心被平移到原点,过原点的子空间就不再吃亏。先中心化、再做最优低秩近似,这一整套流程合起来就是 PCA。下文公式中的 XX 默认指已中心化的 XcX_c。

最优子空间#

字典矩阵#

固定 kk,哪 kk 个方向让重构误差最小?写成优化问题:

min⁡W∈Rd×k  ∥X−WW⊤X∥F2,W⊤W=Ik.\min_{W\in\mathbb{R}^{d\times k}}\;\|X-WW^\top X\|_F^2, \qquad W^\top W=I_k.

WW⊤WW^\top 是到 WW 列空间的正交投影。EP.2已经给了答案:设 X=UΣV⊤X=U\Sigma V^\top,取前 kk 个左奇异向量组成 UkU_k。把它代进投影重构验证一下:Uk⊤UU_k^\top U 恰好”取出” Σ\Sigma 的前 kk 行,于是

UkUk⊤X=UkUk⊤UΣV⊤=UkΣkVk⊤,U_kU_k^\top X=U_kU_k^\top U\Sigma V^\top=U_k\Sigma_kV_k^\top,

这正是截断 SVD,也就是 Eckart–Young–Mirsky 定理保证的最优秩 kk 近似。所以

W=Uk,W=U_k,

字典矩阵的列,就是中心化数据矩阵的前 kk 个左奇异向量。

编码与重构#

对任意样本 xix_i,PCA 的降维与还原写成两条公式:

zi=W⊤(xi−xˉ)∈Rk,x^i=Wzi+xˉ.z_i=W^\top(x_i-\bar{x})\in\mathbb{R}^{k}, \qquad \hat{x}_i=Wz_i+\bar{x}.

ziz_i 是样本在 kk 个主方向下的坐标。注意重构要把均值加回去:x^i\hat{x}_i 落在过 xˉ\bar{x} 的仿射子空间上,而不是过原点的线性子空间。

还有一个常用细节。构造 XX 时经常额外乘一个 1/n−11/\sqrt{n-1}:它把所有奇异值同倍缩放,左奇异向量不变,因此不影响 WW。好处是让 XX⊤XX^\top 恰好等于样本协方差矩阵:

S:=1n−1∑i=1n(xi−xˉ)(xi−xˉ)⊤∈Rd×d.S:=\frac{1}{n-1}\sum_{i=1}^{n}(x_i-\bar{x})(x_i-\bar{x})^\top\in\mathbb{R}^{d\times d}.

SS 是对称矩阵,满足 S⊤=SS^\top=S。它的对角元 SjjS_{jj} 是第 jj 个特征的样本方差;非对角元 SijS_{ij} 是第 ii 与第 jj 个特征的样本协方差,取正、取负、接近零分别对应两个特征正相关、负相关与近似不相关。EP.0所说的特征冗余,在这里表现为 SS 的非对角元显著非零。下一节会看到,把数据投影到 SS 的特征方向上,得到的新特征彼此不相关,其中方差最大的方向正是主成分方向。

最大方差#

投影后的方差#

大多数教材中,PCA 更常见的说法是找方差最大的方向,这实际上和前文按最小重构误差求出的 UkU_k 是一样的。

投影到一条直线之后,每个样本就只剩一个数 w⊤(xi−xˉ)w^\top(x_i-\bar{x}),即它在这条直线上的位置。沿不同直线投影,这串数的散开程度完全不同:沿数据延展的方向,数字分布得散;换接近垂直的方向,数字几乎挤在同一点附近。散得越开,说明样本之间的差异在这个方向上被保留得越多。这个”散开程度”的正式名字就是方差。

同一数据沿延展方向投影方差大,沿近垂直方向投影方差小

样本方差就是把每个投影坐标平方、再取平均。先把求和号里的一项展开:投影坐标是一个数,它的平方等于自己乘上自己的转置,可以写成 w⊤(xi−xˉ)(xi−xˉ)⊤ww^\top(x_i-\bar{x})(x_i-\bar{x})^\top w;常数 1/(n−1)1/(n-1) 与求和号又可以整体收进括号中间:

1n−1∑i=1n(w⊤(xi−xˉ))2=1n−1∑i=1nw⊤(xi−xˉ)(xi−xˉ)⊤w=w⊤(1n−1∑i=1n(xi−xˉ)(xi−xˉ)⊤)w=w⊤Sw.\begin{aligned} \frac{1}{n-1}\sum_{i=1}^{n}\bigl(w^\top(x_i-\bar{x})\bigr)^2 &=\frac{1}{n-1}\sum_{i=1}^{n}w^\top(x_i-\bar{x})(x_i-\bar{x})^\top w\\ &=w^\top\Bigl(\frac{1}{n-1}\sum_{i=1}^{n}(x_i-\bar{x})(x_i-\bar{x})^\top\Bigr)w\\ &=w^\top Sw. \end{aligned}

最后一步正是样本协方差矩阵 SS 的定义。也就是说,数据沿任意方向的方差都可以写成 w⊤Sww^\top Sw,方向之间的差别全部由 SS 决定。

那么哪个 ww 让方差最大?在 ∥w∥=1\|w\|=1 的约束下,写拉格朗日函数 L=w⊤Sw−λ(w⊤w−1)L=w^\top Sw-\lambda(w^\top w-1),对 ww 求导并令其为零,得到 Sw=λwSw=\lambda w。也就是说,投影最散的方向必须是协方差矩阵的特征向量,此时方差正好是特征值 λ\lambda。SS 是实对称矩阵,EP.1保证它有一组完整的正交特征方向;按特征值从大到小排,就依次得到第一、第二、第 kk 个主成分方向。又因为 S=XX⊤S=XX^\top,这些方向正是 XX 的左奇异向量,方差与奇异值满足 λi=σi2\lambda_i=\sigma_i^2。

两种视角的等价#

“方差最大”和”误差最小”是同一件事。原因还是勾股定理:投影与残差互相垂直,

∥xi−xˉ∥2=∥WW⊤(xi−xˉ)∥2+∥(I−WW⊤)(xi−xˉ)∥2.\|x_i-\bar{x}\|^2=\|WW^\top(x_i-\bar{x})\|^2+\|(I-WW^\top)(x_i-\bar{x})\|^2.

左边是样本到数据中心的距离平方,全部样本加起来正比于总方差,与 WW 无关;右边两项分别是”保留下来的方差”与”丢掉的误差”。换句话说,每个样本离中心的距离是固定的,落进子空间里的部分越多,留在外面当残差的部分就越少,所以最小化重构误差,当且仅当最大化投影方差。

这也给出选 kk 的依据:前 kk 个方向保留的方差份额是 ∑i≤kσi2/∑iσi2\sum_{i\le k}\sigma_i^2/\sum_i\sigma_i^2。实验一节会把它画出来。

手写数字实验#

对 MNIST 实际做一遍。训练集 60 00060\,000 张 28×2828\times28 灰度图,每张拉直成 784784 维向量,中心化后对 SS 做特征分解,就得到全部主成分方向。

特征数字#

均值 xˉ\bar{x} 是一张”平均数字”:轮廓模糊,像所有字体的叠影。WW 的列则被称为特征数字,英文 eigendigits:

均值 xˉ\bar{x}前 1212 个主成分方向
MNIST 全部训练图的像素均值前 12 个特征数字,形如幽灵般的笔画模板

特征数字有正有负,本身不是数字,而是一块块”笔画修正模板”:靠前的调整整体轮廓的粗细与位置,靠后的越来越像局部的笔画碎片。每张图的近似就是

x^i=xˉ+z1w1+z2w2+⋯+zkwk,\hat{x}_i=\bar{x}+z_1w_1+z_2w_2+\cdots+z_kw_k,

均值打底,各模板按系数 ziz_i 加减叠加。这组基是为手写数字量身定制的,所以几十块模板就能拼出大部分字形。

重建与残差#

下图每行是一个测试样本,从左到右依次是原图与 k=5,15,30,100k=5,15,30,100 的重构结果,全部是真实计算:

8 个手写数字在不同 k 下的真实重建

k=5k=5 只剩大致轮廓;k=30k=30 时字形可辨,“1”这类结构简单的数字已经不错,“8”仍然模糊;k=100k=100 基本接近原图。被丢弃的尾项,对应的正是笔画细节与噪声。

方差曲线#

各方向的方差 σi2\sigma_i^2 衰减得很快。左图是奇异值 σi\sigma_i,右图是累计方差占比:

奇异值衰减曲线与累计方差占比曲线

实际数字是:k=30k=30 保留约 73%73\% 的方差,k=87k=87 约 90%90\%,k=154k=154 才到 95%95\%。所以”留几个成分”没有普适答案,按目标份额选 kk,再看一眼重建效果,比死记某个数字可靠。

线性的边界#

编解码的耦合#

回头看 PCA 的编码与重构:z=W⊤(x−xˉ)z=W^\top(x-\bar{x}) 与 x^=Wz+xˉ\hat{x}=Wz+\bar{x} 都是线性映射,而且两个方向被同一个 WW 的转置绑死。数据若躺在弯曲的非线性结构上,任何线性子空间都只能得到一个”拍扁”的近似:这不是 kk 选多小的问题,而是方法本身的边界。

深度自编码器#

放松约束的思路很自然:编码器、解码器分别用神经网络去学,目标不变,仍是最小重构误差

min⁡D, E  Ex[∥D(E(x))−x∥2],\min_{D,\,E}\;\mathbb{E}_{x}\bigl[\|D(E(x))-x\|^2\bigr],

但不再要求线性,也不要求互为转置。这就是深度自编码器,auto-encoder:EE 把输入逐层压缩到一个低维”瓶颈”,DD 再逐层展开重建,整体呈漏斗形:

自编码器的漏斗结构,编码器压缩到瓶颈、解码器展开重建

从这个角度看,PCA 是它的退化版本:编码和解码都只有一层线性变换,且权重恰好互为转置。

嵌入对比#

同样压到 22 维,线性与非线性的差别可以直接看出来。我们在训练集上训练了一个小型自编码器 784→128→2→128→784784\to128\to2\to128\to784,瓶颈就是二维编码 zz;另一边取 PCA 的前两个主成分。把测试集的一万张图按真实类别着色:

PCA 与自编码器的二维嵌入散点对比

两张散点的坐标系不同,各自是两种方法给出的二维编码,可比的不是点的位置,而是簇的聚散。PCA 的投影里各类挤成一团,只有”1”大致分离出去;自编码器的编码则把若干类别扯成了相对分开的条带,“1”更是完全脱离主体。

代价同样真实:下面每行是一个测试样本的原图与这个小网络的重建,二维瓶颈太极端,输出比 PCA 保留几十个成分时模糊得多。

自编码器从二维瓶颈重建的测试样本,左侧为原图

它优先保住的是结构的可分性,而不是还原细节。非线性方法能挖到线性方法漏掉的结构,这正是这条线索通向深度学习的入口。

结语#

PCA 就三件事:先把数据中心化,让过原点的子空间不吃亏;再取中心化数据矩阵的前 kk 个左奇异向量作字典,即 W=UkW=U_k;编码是 zi=W⊤(xi−xˉ)z_i=W^\top(x_i-\bar{x}),重构是 x^i=Wzi+xˉ\hat{x}_i=Wz_i+\bar{x}。它与”最大投影方差”是同一个最优解,选 kk 时看保留的方差份额。而它的线性本质,正是自编码器要放松的约束。

参考资料#

博客桌宠