Series · ML Math Derivations · Chapter 17

机器学习数学推导(十七):降维与主成分分析

高维空间对基于距离的算法极其不友好。本文从最大方差与最小重构误差两个等价视角推导 PCA,并依次扩展到核 PCA、LDA、t-SNE 与 ICA——配套图示直接展示同一份数据上各方法到底干了什么。

这篇文章讲什么

把一万维的数据扔给聚类算法,多半会失败——不是算法不好,而是 高维空间本身对距离类方法极其不友好:体积都集中在球壳上,最近邻和最远邻的距离比趋近于 1,“近"这个概念失去了信息。降维的目的就是回应这件事:把数据投到一个低维空间里,同时尽可能保留真正重要的结构。

你将学到:

  1. 高维空间为什么反直觉(维度灾难)
  2. PCA 的两种等价推导:最大方差视角与最小重构误差视角
  3. 实践中怎么选 $k$(碎石图、累计方差曲线、重构质量)
  4. 核 PCA:在隐式特征空间里做 PCA,用来处理非线性流形
  5. LDA:用 Fisher 准则做有监督降维
  6. t-SNE:基于概率分布、保留邻域结构的可视化方法
  7. ICA vs PCA:去相关 ≠ 独立

前置知识:线性代数(特征值/特征向量、对称矩阵的谱定理)、基本概率(方差、协方差),以及对 核方法 有些印象。


1. 维度灾难

1.1 两个会颠覆直觉的现象

体积集中在球壳上。 $d$ 维单位超球的体积是

$$V_d = \frac{\pi^{d/2}}{\Gamma(d/2 + 1)}.$$

比常数本身更重要的是它的形状变化:随着 $d$ 增大,几乎所有体积都集中在一层薄薄的球壳里。半径 $0.99$ 以内的体积占比是

$$(0.99)^d \xrightarrow{d \to \infty} 0.$$

$d = 100$ 时这个比例约为 $36.6\%$,$d = 1000$ 时基本归零。高维球的绝大部分都是"皮”。

距离也会集中。 对很多分布而言,独立同分布样本之间最大距离与最小距离的比值会趋近于 1:

$$\frac{\max_{i \ne j}\|\mathbf{x}_i - \mathbf{x}_j\|}{\min_{i \ne j}\|\mathbf{x}_i - \mathbf{x}_j\|} \xrightarrow{d \to \infty} 1.$$

当所有点之间的距离都差不多时,$k$-NN、核密度、聚类这些算法就失去判别能力了。这也是为什么先把高维数据压到一个学到的低维表示里,往往是整个流水线中性价比最高的一步。

1.2 降维到底为了什么

  • 特征提取:去掉冗余方向,达到去噪、加速下游计算、节省存储的效果。
  • 可视化:投到 2D/3D,让人能直接看到簇结构。
  • 正则化:把模型限制在低维子空间本身就是一种很强的归纳偏置。

后面要讨论的方法可以这样归类:

类型方法是否有监督是否线性
方差PCA
类间分离LDA
独立性ICA
隐式特征空间核 PCA
邻域保持t-SNE / UMAP

2. PCA:最大方差视角

2.1 设定

数据 $\{\mathbf{x}_1, \dots, \mathbf{x}_N\}$,每个 $\mathbf{x}_i \in \mathbb{R}^d$。先 中心化:减去均值 $\bar{\mathbf{x}} = \tfrac{1}{N}\sum_i \mathbf{x}_i$,下面假设 $\bar{\mathbf{x}} = \mathbf{0}$。把样本按行堆成 $\mathbf{X} \in \mathbb{R}^{N \times d}$,样本协方差矩阵 就是

$$\mathbf{S} = \frac{1}{N} \mathbf{X}^\top \mathbf{X} \in \mathbb{R}^{d \times d}.$$

$\mathbf{S}$ 是对称半正定阵,由谱定理可知存在一组单位正交特征向量,且特征值非负。

2.2 第一主成分

我们要找一个单位方向 $\mathbf{w}_1 \in \mathbb{R}^d$,使数据投影后的方差最大。投影值是标量 $z_i = \mathbf{w}_1^\top \mathbf{x}_i$,因为数据已经中心化了,方差就是

$$\mathrm{Var}(z) = \frac{1}{N}\sum_{i=1}^{N} (\mathbf{w}_1^\top \mathbf{x}_i)^2 = \mathbf{w}_1^\top \mathbf{S}\, \mathbf{w}_1.$$

约束 $\mathbf{w}_1^\top \mathbf{w}_1 = 1$。拉格朗日函数

$$\mathcal{L}(\mathbf{w}_1, \lambda_1) = \mathbf{w}_1^\top \mathbf{S}\, \mathbf{w}_1 - \lambda_1 (\mathbf{w}_1^\top \mathbf{w}_1 - 1),$$

令 $\partial \mathcal{L} / \partial \mathbf{w}_1 = 2\mathbf{S}\mathbf{w}_1 - 2\lambda_1 \mathbf{w}_1 = 0$,得到 特征值方程

$$\mathbf{S}\, \mathbf{w}_1 = \lambda_1\, \mathbf{w}_1, \tag{1}$$

而投影方差正好等于 $\mathbf{w}_1^\top \mathbf{S}\, \mathbf{w}_1 = \lambda_1$。所以要最大化方差,就 取 $\mathbf{S}$ 最大特征值对应的特征向量

PCA on a 2D Gaussian cloud

上图把这件事在一团相关的二维高斯数据上画了出来。左图里橙色箭头(PC1)就是数据散布最大的方向;绿色箭头(PC2)和它正交,承担剩下的方差;两条椭圆则是经验高斯的 $1\sigma$、$2\sigma$ 等高线。右图是同一批点经过刚体旋转 $\mathbf{z}_i = \mathbf{W}^\top \mathbf{x}_i$ 之后的样子:PC1 变成水平轴,PC2 变成垂直轴,数据这时已经去相关——经验协方差矩阵就是对角阵 $\mathrm{diag}(\lambda_1, \lambda_2)$。从几何上看,PCA 就是 把坐标轴对齐到数据主轴上的那个旋转

2.3 多个主成分

把上面的论证加上"与已选方向正交"的约束反复做下去,就得到完整结论:前 $k$ 个主成分是 $\mathbf{S}$ 的特征向量 $\mathbf{w}_1, \dots, \mathbf{w}_k$,按 $\lambda_1 \ge \lambda_2 \ge \dots \ge \lambda_k$ 排序。把它们拼成投影矩阵

$$\mathbf{W}_k = [\mathbf{w}_1, \dots, \mathbf{w}_k] \in \mathbb{R}^{d \times k},$$

样本 $\mathbf{x}_i$ 的低维表示就是 $\mathbf{z}_i = \mathbf{W}_k^\top \mathbf{x}_i \in \mathbb{R}^k$。

2.4 怎么选 $k$

两张图基本就够用了。

Scree plot

碎石图(scree plot) 直接画特征值。在一个由秩为 $5$ 的潜信号 + 各向同性噪声生成的合成数据上,谱在 $k = 5$ 处有一个清晰的"肘点":之上是信号,之下是噪声。真实数据上肘点通常没这么干净,但这张图永远是第一步要看的。

Cumulative variance

累计方差比例

$$R(k) \;=\; \frac{\sum_{i=1}^{k} \lambda_i}{\sum_{i=1}^{d} \lambda_i} \tag{2}$$

更适合直接做决策:取使 $R(k)$ 跨过保留率阈值的最小 $k$。在 UCI 手写数字数据集上,$D = 64$ 个像素特征里,$90\%$ 保留率只需要 $k = 21$,$95\%$ 需要 $k = 29$,$99\%$ 也只要 $k = 41$——超过三分之一的特征对表示这些数字图像来说是冗余的。

1
2
3
4
5
6
7
8
import numpy as np
from sklearn.decomposition import PCA

X = np.random.randn(500, 50)
pca = PCA().fit(X)
cum = np.cumsum(pca.explained_variance_ratio_)
k_95 = int(np.searchsorted(cum, 0.95) + 1)
print(f"达到 95% 方差所需主成分数: {k_95}")

3. PCA:最小重构误差视角

PCA 还有一种同样自然的推导。先把"方差"忘掉,问一个不一样的问题:在所有秩为 $k$ 的投影里,哪一个对原始数据的 逼近 最好?

给定单位正交的 $\mathbf{W}_k$,$\mathbf{x}_i$ 的秩-$k$ 重构是

$$\hat{\mathbf{x}}_i = \mathbf{W}_k\, \mathbf{W}_k^\top \mathbf{x}_i,$$

重构误差为

$$J_{\mathrm{recon}}(\mathbf{W}_k) = \frac{1}{N} \sum_{i=1}^{N} \big\| \mathbf{x}_i - \mathbf{W}_k \mathbf{W}_k^\top \mathbf{x}_i \big\|^2.$$

利用 $\mathrm{tr}(AB) = \mathrm{tr}(BA)$ 和 $\mathbf{W}_k^\top \mathbf{W}_k = I$,可以推出 方差分解

$$\underbrace{\mathrm{tr}(\mathbf{S})}_{\text{总方差}} \;=\; \underbrace{\mathrm{tr}(\mathbf{W}_k^\top \mathbf{S}\, \mathbf{W}_k)}_{\text{捕获方差}} \;+\; \underbrace{J_{\mathrm{recon}}(\mathbf{W}_k)}_{\text{丢失 = 重构误差}}. \tag{3}$$

总和是固定的,所以 最大化捕获方差和最小化重构误差是同一个优化问题。两种视角导出的特征值方程 (1) 完全一致,最优的 $\mathbf{W}_k$ 也完全一样。

Reconstruction quality vs k

上图把 (3) 的含义画在了手写数字数据集上。MSE 曲线先快速下降然后趋于平稳——大部分误差都被前几个主成分消掉了。右边的图像网格展示了两个具体数字的重构(最左一列是原图):$k = 2$ 时几乎只剩一个模糊轮廓;$k = 8$ 时已经能认出数字;$k = 16$ 时笔画清晰;$k = 32$ 时与原图肉眼几乎一致。这就是 (3) 在实践层面的说法:到底要保留多少个主成分,取决于下游任务对保真度的要求。

本节的要点。 PCA 是同时满足"线性去相关"和"在 Frobenius 范数意义下的最佳秩-$k$ 逼近"这两个性质的唯一线性方法。任何其他线性"特征提取器"至少要放弃其中之一。


4. 核 PCA:用核技巧处理非线性流形

4.1 线性 PCA 撞墙的地方

线性 PCA 只能旋转和投影,它不能"弯"。如果数据本身就在一个曲面上——同心圆、瑞士卷、球面——那么任何线性投影都不可能保留它的结构。

4.2 在特征空间里做 PCA

借助 核技巧 :把每个点通过特征映射 $\phi: \mathbb{R}^d \to \mathcal{H}$ 送进一个(可能是无限维的)特征空间,在那里做 PCA。我们从来不把 $\phi$ 显式写出来,只需要内积

$$k(\mathbf{x}_i, \mathbf{x}_j) = \phi(\mathbf{x}_i)^\top \phi(\mathbf{x}_j).$$

常用核:

  • 多项式核:$k(\mathbf{x}, \mathbf{y}) = (\mathbf{x}^\top \mathbf{y} + c)^p$
  • RBF(高斯)核:$k(\mathbf{x}, \mathbf{y}) = \exp(-\gamma \|\mathbf{x} - \mathbf{y}\|^2)$

构造 $N \times N$ 的核矩阵 $K_{ij} = k(\mathbf{x}_i, \mathbf{x}_j)$,按下式在特征空间中进行中心化:

$$\tilde{\mathbf{K}} = \mathbf{K} - \mathbf{1}_N \mathbf{K} - \mathbf{K}\,\mathbf{1}_N + \mathbf{1}_N \mathbf{K}\,\mathbf{1}_N, \qquad \mathbf{1}_N = \tfrac{1}{N}\mathbf{1}\mathbf{1}^\top,$$

然后求解 $\tilde{\mathbf{K}}\, \boldsymbol{\alpha}_k = N \tilde{\lambda}_k\, \boldsymbol{\alpha}_k$。新样本 $\mathbf{x}$ 在第 $k$ 个特征空间主成分上的投影为

$$z_k(\mathbf{x}) = \sum_{i=1}^{N} \alpha_{k,i}\, k(\mathbf{x}_i, \mathbf{x}).$$

Kernel PCA on a swiss roll

瑞士卷是经典示例。原始 3D 流形其实是一张 2D 卷起来的"纸",颜色编码了点在这张纸上的位置。线性 PCA(中)把它压成一个平面,把流形上相距很远的部分叠到一起——黄色和红色挤在一块。RBF 核 PCA(右)则相当于在一个高维特征空间里做 PCA,那里这张纸基本是平的,于是 2D 投影把它"展开"了:颜色平滑过渡,恰好对应原始流形上的位置。

复杂度:线性 PCA 是 $O(d^3 + Nd^2)$;核 PCA 是 $O(N^3 + N^2 d)$。当 $N \ll d$(如基因数据,几千特征几百样本)时,核 PCA 反而更便宜。


5. LDA:有监督降维

PCA 完全不看标签。对分类任务来说这很浪费:一个方向可能方差极大却对分类毫无帮助;反过来,一个方差很小的方向也可能是完美的判别方向。线性判别分析(LDA) 利用标签找出 类间 散度相对 类内 散度最大的方向。

5.1 二分类推导

两类 $C_1, C_2$,样本数 $N_1, N_2$,类均值 $\boldsymbol{\mu}_1, \boldsymbol{\mu}_2$。定义

$$\mathbf{S}_B = (\boldsymbol{\mu}_1 - \boldsymbol{\mu}_2)(\boldsymbol{\mu}_1 - \boldsymbol{\mu}_2)^\top \quad \text{(类间散度)}$$$$\mathbf{S}_W = \sum_{c=1}^{2} \sum_{i \in C_c}(\mathbf{x}_i - \boldsymbol{\mu}_c)(\mathbf{x}_i - \boldsymbol{\mu}_c)^\top \quad \text{(类内散度)}$$

最大化 Fisher 准则——投影后类间方差和类内方差之比:

$$J(\mathbf{w}) = \frac{\mathbf{w}^\top \mathbf{S}_B\, \mathbf{w}}{\mathbf{w}^\top \mathbf{S}_W\, \mathbf{w}}. \tag{4}$$

令 $\nabla J = 0$ 得到广义特征值问题 $\mathbf{S}_B \mathbf{w} = \lambda\, \mathbf{S}_W \mathbf{w}$。利用 $\mathbf{S}_B$ 的秩一结构可以化成闭式解:

$$\mathbf{w}^* \propto \mathbf{S}_W^{-1}(\boldsymbol{\mu}_1 - \boldsymbol{\mu}_2). \tag{5}$$

5.2 多分类

对 $C$ 类,设全局均值为 $\boldsymbol{\mu}$,把 $\mathbf{S}_B$ 推广为

$$\mathbf{S}_B = \sum_{c=1}^{C} N_c\, (\boldsymbol{\mu}_c - \boldsymbol{\mu})(\boldsymbol{\mu}_c - \boldsymbol{\mu})^\top.$$

求解 $\mathbf{S}_B \mathbf{w} = \lambda\, \mathbf{S}_W \mathbf{w}$ 取前几个特征向量。注意 $\mathbf{S}_B$ 是 $C$ 个秩一矩阵之和,且各加项满足 $\sum_c N_c (\boldsymbol{\mu}_c - \boldsymbol{\mu}) = 0$,所以 $\mathrm{rank}(\mathbf{S}_B) \le C - 1$——也就是说 LDA 最多只能输出 $C - 1$ 个判别方向。这是个硬上限,工程里很容易忘。

5.3 PCA vs LDA 一表对比

方面PCALDA
是否使用标签
目标最大方差最大类间分离
输出维数至多 $d$至多 $C - 1$
主要用途可视化、去噪分类预处理

6. t-SNE:用概率分布保留邻域结构

PCA 保留的是 全局 结构(方差、距离);但对 2D 可视化来说这往往是错的目标。看散点图的人想看到的是 ,这通常意味着保留 局部邻域t-SNE 用一个概率公式精确地做到了这件事。

6.1 高维相似度

对每对 $(i, j)$,由各点自带的高斯定义对称相似度:

$$p_{j \mid i} = \frac{\exp(-\|\mathbf{x}_i - \mathbf{x}_j\|^2 / 2\sigma_i^2)}{\sum_{k \ne i} \exp(-\|\mathbf{x}_i - \mathbf{x}_k\|^2 / 2\sigma_i^2)}, \qquad p_{ij} = \frac{p_{j \mid i} + p_{i \mid j}}{2N}.$$

每个点的带宽 $\sigma_i$ 通过二分搜索来定,使 困惑度 $2^{H(P_i)}$ 与用户给定值一致——大致可以理解为每个点的"有效邻居数"。

6.2 低维相似度与重尾

低维空间里改用 Student-$t$(柯西)核:

$$q_{ij} = \frac{(1 + \|\mathbf{y}_i - \mathbf{y}_j\|^2)^{-1}}{\sum_{k \ne l}(1 + \|\mathbf{y}_k - \mathbf{y}_l\|^2)^{-1}}. \tag{6}$$

为什么要重尾?2D 的"地方"比原空间小得多,中等距离的点必然要挤到一起。柯西分布按 $\|y\|^{-2}$ 衰减,比高斯的 $\exp(-\|y\|^2)$ 慢得多,给远点留出更多空间——这正是著名的 拥挤问题(crowding problem) 的解法。

6.3 优化

最小化 $C = \mathrm{KL}(P \,\|\, Q) = \sum_{i \ne j} p_{ij} \log (p_{ij}/q_{ij})$。梯度有非常清晰的物理含义:

$$\frac{\partial C}{\partial \mathbf{y}_i} = 4\sum_{j}(p_{ij} - q_{ij})(1 + \|\mathbf{y}_i - \mathbf{y}_j\|^2)^{-1}(\mathbf{y}_i - \mathbf{y}_j). \tag{7}$$

$p_{ij} > q_{ij}$ 是 吸引项(在原空间相似但低维隔得太远);$p_{ij} < q_{ij}$ 是 排斥项(原空间不相似但低维挤太近)。

PCA vs LDA vs t-SNE

上图把三种方法都用在了手写数字数据集上。PCA(左)把方差打包进两个轴,但大部分类别的点严重重叠——方差并不等于类身份。LDA(中)显式地最大化类间分离,给出清晰的彩色条带,但它最多只能输出 $C - 1 = 9$ 维。t-SNE(右)完全无视方差和全局几何,把嵌入"扭"得让局部邻居都在一起,结果就是论文里常见的那种界限分明的簇团。

实践提醒。 t-SNE 是 可视化 工具,不是聚类工具。t-SNE 图里的簇间距离、簇大小都没有可解释的意义;结果还会随随机种子、困惑度和迭代次数而变化。聚类应该在原空间(或 PCA 空间)里做,t-SNE 只用来 展示 结果。


7. ICA:你要的不是去相关,而是独立

PCA 找的是 正交 的最大方差方向。两个 PCA 主成分之间是不相关的——但"不相关"比"独立"弱得多。如果原始信号本身是独立且非高斯的,可以用 独立成分分析(ICA) 把它们拆开。

经典场景是 鸡尾酒会问题:$K$ 个麦克风录到 $K$ 个独立源的线性混合

$$\mathbf{x} = A\, \mathbf{s},$$

只给定 $\mathbf{x}$ 和"$s_j$ 互相独立、最多有一个是高斯"这个假设,要恢复 $\mathbf{s}$。ICA 通过一个解混矩阵 $W$ 让恢复出来的成分 $\mathbf{y} = W\mathbf{x}$ 尽可能非高斯——典型的对比函数有负熵或峰度。直觉来自中心极限定理:独立变量的任何线性混合都比变量本身"更高斯",所以解开后的真正源应该正是 最不高斯 的方向。

ICA vs PCA on source separation

上图把这件事画了出来。第一行是两个真实独立源——一个正弦,一个方波。第二行是两路观测到的混合(每个麦克风都同时听到两个源)。第三行的 PCA 找出了正交的最大方差方向,但这两个轴 不是 原始源——可以清楚看到正弦和方波的形状在每个 PCA 成分里相互干扰。第四行的 ICA 则几乎完美地恢复了原始源(差一个符号和尺度,这是 ICA 模型自带的歧义性)。

记住这两者的区别最简洁的说法是:PCA 去相关,ICA 解独立。压缩和可视化用 PCA;如果你有理由相信数据是若干独立源的混合(音频分离、EEG 去噪、fMRI 成分分析),那就用 ICA。


8. 一张总表

方法优化目标输出维数是否线性是否用标签主要用途
PCA方差 / 重构 MSE至多 $d$去噪、压缩、预处理
核 PCA特征空间方差至多 $N$非线性流形
LDA类间分离(Fisher)至多 $C - 1$分类预处理
ICA统计独立性$K$ 个源源分离
t-SNE局部邻域 KL$2$ 或 $3$仅可视化
UMAP模糊拓扑结构任意低维可选更快、更顾全局的可视化

碰到新表格数据时,一个相当稳妥的默认流程是:标准化 → PCA 看谱 → 砍掉噪声成分 → LDA 或 t-SNE 可视化。本文里其它工具,都是当这个流程的某个假设崩了的时候拿出来用的(非线性流形、独立源、只关心邻域结构……)。


9. 练习题

练习 1(方差保留)。 $\mathbf{S}$ 的特征值是 $(5, 3, 1, 0.5, 0.5)$,前两个主成分保留多少方差?

解答。 总和 $= 10$,前两个 $= 8$,保留率 $80\%$。

练习 2(中心化)。 为什么 PCA 之前必须先中心化?

解答。 协方差矩阵 $\mathbf{S} = \tfrac{1}{N}\mathbf{X}^\top \mathbf{X}$ 只有在 $\bar{\mathbf{x}} = \mathbf{0}$ 时才等于样本协方差。不中心化的话,$\mathbf{X}^\top \mathbf{X}$ 的最大特征向量大致指向数据均值方向,而不是方差最大的方向。

练习 3(PCA vs t-SNE,10 个分得很开的簇)。 你预期看到什么?

解答。 PCA:线性投影,可能把部分重叠的簇压在一起。t-SNE:十个清晰分开的团,但团之间的 距离 和团的 大小 都没有信息含量。

练习 4(瑞士卷上的核 PCA)。 为什么能 work?

解答。 RBF 特征映射会把原空间相距很近的点(小 $\|\mathbf{x}_i - \mathbf{x}_j\|$)送到很相似的特征向量,与它们在原空间里的全局位置无关。在那个特征空间里做 PCA,捕捉到的就是流形的内在坐标,而不是嵌入它的 3D 坐标。

练习 5(PCA 白化)。 是什么、用来干什么?

解答。 白化变换 $\mathbf{z} = \boldsymbol{\Lambda}^{-1/2} \mathbf{W}^\top \mathbf{x}$ 让输出的协方差是单位阵——既去相关又是单位方差。它常用作 ICA 的预处理(ICA 假设输入是白化过的),以及对特征尺度敏感的模型的归一化步骤。


参考文献

[1] Pearson, K. (1901). On lines and planes of closest fit to systems of points in space. Philosophical Magazine, 2(11), 559-572.

[2] Hotelling, H. (1933). Analysis of a complex of statistical variables into principal components. Journal of Educational Psychology, 24(6), 417-441.

[3] Fisher, R. A. (1936). The use of multiple measurements in taxonomic problems. Annals of Eugenics, 7(2), 179-188.

[4] Schölkopf, B., Smola, A., & Müller, K.-R. (1998). Nonlinear component analysis as a kernel eigenvalue problem. Neural Computation, 10(5), 1299-1319.

[5] Hyvärinen, A., & Oja, E. (2000). Independent component analysis: algorithms and applications. Neural Networks, 13(4-5), 411-430.

[6] Van der Maaten, L., & Hinton, G. (2008). Visualizing data using t-SNE. JMLR, 9(11), 2579-2605.

[7] McInnes, L., Healy, J., & Melville, J. (2018). UMAP: Uniform manifold approximation and projection for dimension reduction. arXiv:1802.03426.

[8] Jolliffe, I. T. (2002). Principal Component Analysis (2nd ed.). Springer.


系列导航

Liked this piece?

Follow on GitHub for the next one — usually one a week.

GitHub