📑 本页目录(点开跳转)
05b · PCA 的推导
⏱ 36 分钟 | ⭐⭐⭐ 上一章说降维是刚需,这一章说它凭什么这么降
🎯 一句话
PCA 就是把数据的协方差矩阵做特征分解,拿最大的几个特征向量当新坐标轴。
这句话里几乎每个词都需要解释。本章从「协方差矩阵到底是什么」开始, 把 PCA 的两条独立推导各走一遍 —— 而它们会在同一个答案上会合。
🔗 这一章卡在哪两块之间: 第 5 章 · 维度灾难论证了降维是刚需(500 维时最远的点只比最近的远 19%),并把降维列为五条出路的第 ①条; 基础教程第 6 章教了怎么用:
PCA(n_components=...)、怎么防泄漏、什么时候该换成 LDA。 中间那一层「凭什么是这样」,就是这一章。💡 本章只管「为什么」:协方差矩阵 → 两条推导 → 一个能手算完的例子。 「实践中到底怎么算、什么时候会翻车」全部放在下一章 05c · SVD 与实践。
🧊 一、先补一个前置:协方差矩阵
后面所有推导都建立在它上面,而这套教程之前从没讲过它。
从方差到协方差
方差 Var(x) = (1/n) Σ (xᵢ − x̄)²
「这个特征自己有多分散」
协方差 Cov(x, y) = (1/n) Σ (xᵢ − x̄)(yᵢ − ȳ)
「两个特征是不是【一起】偏离各自的均值」
Cov > 0 → 同向:x 高于均值时 y 也倾向于高于均值
Cov < 0 → 反向
Cov = 0 → 线性无关
⚠️
Cov = 0不等于「独立」。它只说明没有线性关系。 让 x 均匀分布在 [−1,1]、y = x²,两者协方差是 0,但 y 完全由 x 决定。 PCA 只能看见线性关系,这个局限从第一步就埋下了(第七节会算这笔账)。
写成矩阵:三步
① 中心化:每一列减去它自己的均值 Xc = X − mean(X, axis=0)
② 相乘: Xcᵀ Xc
③ 除以样本数: Σ = (1/n) · Xcᵀ Xc
$$\Sigma \;=\; \frac{1}{n}X_c^\top X_c,\qquad \Sigma_{jk} = \frac1n\sum_{i=1}^n (x_{ij}-\bar x_j)(x_{ik}-\bar x_k)$$
⚠️ 第①步不能省。不中心化算出来的不是协方差,是「二阶原点矩」, 它同时编码了「数据云的形状」和「数据云离原点多远」。 PCA 会因此找到一个指向数据云中心的假方向 —— 那个方向什么信息都没有,只是说明你忘了减均值。
⭐ 四条性质(推导全靠它们)
| 性质 | 为什么 | 后面用在哪 |
|---|---|---|
| 对称 $\Sigma = \Sigma^\top$ | 定义里 j、k 可交换 | ⭐ 保证特征值全是实数,不同特征值的特征向量自动正交 |
| 半正定 $w^\top\Sigma w \ge 0$ | 因为 $w^\top\Sigma w$ 就是投影后的方差,方差不可能是负的 | ⭐ 保证特征值全 ≥ 0,可以按大小排序 |
| 对角线是各维方差 | 定义里 j = k 时退化成方差 | 解释方差比的分母 |
| 迹 = 总方差 $\mathrm{tr}(\Sigma)=\sum_j \mathrm{Var}(x_j)$ | 对角线之和 | ⭐⭐ 而 迹 = 特征值之和,所以「解释方差比 = λᵢ / Σλ」有意义 |
💡 几何直觉:协方差矩阵就是这团数据云的形状和朝向。 把它画出来是一个椭圆:椭圆的轴方向 = 特征向量,轴长 ∝ √特征值。 PCA 要找的,就是这个椭圆最长的那根轴。
⚠️ 它对单位极其敏感(下一章会把这条变成一条硬规则)
特征 A = 年收入(元) 标准差 ≈ 50000 → 方差 2.5 × 10⁹
特征 B = 年龄(岁) 标准差 ≈ 10 → 方差 100
两者方差差 2500 万倍 → 第一主成分基本就是"年收入"本身
把收入的单位换成【万元】:标准差 5 → 方差 25
→ 现在年龄反而占主导
⭐ 同一批数据,只换了个单位,第一主成分从收入变成了年龄
📈 二、PCA 的第一种推导:最大化投影方差
问题写清楚
给一堆已中心化的数据 Xc(n 行样本,d 列特征)
找一个【单位向量】w,把每个样本投影到它上面:z = Xc · w
要让投影后的这 n 个数【方差最大】
💡 为什么"方差最大"是个合理目标:方差 = 区分度。 投到一个方差很小的方向上,所有样本挤成一团,你等于把这批数据的差异抹掉了。
⭐ 全章枢纽:投影后的方差就是 wᵀΣw
投影后的均值是 0(因为数据已中心化),所以方差就是平方和除以 n:
$$\mathrm{Var}(X_c w) = \frac1n (X_c w)^\top (X_c w) = \frac1n w^\top X_c^\top X_c\, w = w^\top \Sigma w$$
💡 人话:要在方向 w 上的方差,不用真去投影,把 w 夹在协方差矩阵两边算一下就有了。
为什么必须约束 ‖w‖ = 1
把 w 放大 10 倍,$w^\top\Sigma w$ 就变成 100 倍。 不加约束的话最优解是无穷大,问题根本没有答案。约束成单位长度, 才是在问「哪个方向最好」而不是「哪个向量最长」。
拉格朗日 → 特征方程
📐 推导(四行,想看再点)
$$\mathcal{L}(w,\lambda) = w^\top\Sigma w - \lambda\,(w^\top w - 1)$$
对 w 求导并令其为 0(用到 $\partial (w^\top A w)/\partial w = 2Aw$,A 对称):
$$2\Sigma w - 2\lambda w = 0 \;\Longrightarrow\; \boxed{\Sigma w = \lambda w}$$
这就是特征方程。 再把它代回目标函数:
$$\mathrm{Var} = w^\top \Sigma w = w^\top(\lambda w) = \lambda\, \underbrace{w^\top w}_{=1} = \lambda$$
得到两个结论,第二个更重要:
| 结论 | 说明 |
|---|---|
| 最优的 w 必须满足 Σw = λw | 也就是说,主成分方向只能是协方差矩阵的特征向量 |
| ⭐⭐ 投影后的方差恰好等于 λ | 所以「挑方差最大的方向」= 「挑最大的特征值」。特征值不是抽象符号,它就是那个方向上的方差 |
第二、第三主成分
第二主成分:在与 w₁ 正交的额外约束下重复上面的推导 → 得到第二大特征值 λ₂ 的特征向量。 以此类推。
⭐ 正交性是白送的:Σ 是对称矩阵,而对称矩阵不同特征值对应的特征向量自动正交。 所以你不需要额外费力气去"强制"主成分互相垂直 —— 谱定理已经保证了。 这也是为什么主成分之间的相关系数恰好是 0:PCA 顺手做了一次去相关。
📉 三、PCA 的第二种推导:最小化重构误差
同一个 PCA,还有一个完全不同的问法:
我要用一个 k 维子空间去【近似】这些点,
每个点用它在子空间里的投影 x̂ᵢ 代替。
目标:让所有点的重构误差 Σ‖xᵢ − x̂ᵢ‖² 最小
看起来和"最大化方差"是两码事。但它们是同一个问题。
一步勾股定理就说完了
投影 x̂ 和残差 (x − x̂) 互相垂直(这是正交投影的定义),所以:
$$\underbrace{\|x_i\|^2}_{\text{到中心的距离²}} = \underbrace{\|\hat x_i\|^2}_{\text{投影²}} + \underbrace{\|x_i - \hat x_i\|^2}_{\text{残差²}}$$
对所有样本求和再除以 n:
$$\underbrace{\text{总方差}}_{\text{和 }w\text{ 无关,是个定值}} = \underbrace{\text{投影方差}}_{\text{推导一在最大化}} + \underbrace{\text{平均重构误差}}_{\text{推导二在最小化}}$$
⭐ 左边是常数(就是 $\mathrm{tr}(\Sigma)$,数据一给定就定了)。 右边两项此消彼长 —— 把投影方差顶到最大,重构误差必然被压到最小。两种推导必然给出同一个答案。
⚠️ 一个非常常见的误解:PC1 不是回归线
线性回归:最小化【竖直方向】的距离(只在 y 上量误差,x 被当成已知)
PCA :最小化【垂直于直线】的距离(x 和 y 平起平坐)
→ 同一批点,两条线一般【不重合】
下一节那个手算例子里,OLS 回归线的斜率是 0.9,而 PC1 的斜率是 1.0 —— 数据完全相同。
🔑 差别的来源是「谁是因、谁是果」:回归假设 x 是给定的、只有 y 带噪声(这正是 第 1 章里
y = w·x + ε那个建模假设); PCA 不区分自变量因变量,它眼里所有维度地位平等。
🔢 四、一个能手算完的例子
五个样本,两个特征。建议真的拿笔算一遍,20 分钟,比读十页推导管用。
X = (1,2) (2,3) (3,5) (4,4) (5,6)
① 均值:x̄ = 3, ȳ = 4
② 中心化 Xc = (−2,−2) (−1,−1) (0,1) (1,0) (2,2)
③ Xcᵀ Xc = [[10, 9],
[ 9,10]]
④ 除以 n=5 → Σ = [[2.0, 1.8],
[1.8, 2.0]]
⭐ 形如 $\begin{bmatrix}a&b\\b&a\end{bmatrix}$ 的矩阵,特征值就是 a ± b,特征向量是 [1,1] 和 [1,−1]:
| 主成分 | 特征值 λ | 单位特征向量 | 解释方差比 |
|---|---|---|---|
| PC1 | 3.8 | [1, 1]/√2(斜率 1.0,45°) | 3.8 / 4.0 = 95% |
| PC2 | 0.2 | [1, −1]/√2 | 0.2 / 4.0 = 5% |
验算三处(这三处对上了,说明你理解对了):
① 总方差 tr(Σ) = 2.0 + 2.0 = 4.0 = 3.8 + 0.2 = λ₁ + λ₂ ✅
② 投影方差 把 5 个点投到 [1,1]/√2 上:
−2.828, −1.414, 0.707, 0.707, 2.828 → 方差 = 3.8 = λ₁ ✅
③ 回归对照 OLS 斜率 = Cov/Var(x) = 1.8/2 = 0.9 ≠ 1.0 = PC1 斜率 ⚠️
import numpy as np
X = np.array([[1., 2], [2, 3], [3, 5], [4, 4], [5, 6]])
Xc = X - X.mean(axis=0) # ⭐ 中心化,这一步不能省
Sigma = Xc.T @ Xc / len(X) # ⭐ 协方差矩阵
lam, W = np.linalg.eigh(Sigma) # ⭐ 对称矩阵用 eigh,不用 eig
lam, W = lam[::-1], W[:, ::-1] # eigh 是升序,翻成降序
print("协方差矩阵\n", Sigma) # [[2. 1.8] [1.8 2. ]]
print("特征值 ", lam) # [3.8 0.2]
print("解释方差比 ", lam / lam.sum()) # [0.95 0.05]
Z = Xc @ W # ⭐ 主成分得分 = 中心化数据 × 特征向量
print("得分的方差 ", Z.var(axis=0)) # [3.8 0.2] 正好是特征值
print("OLS 斜率 ", np.polyfit(X[:, 0], X[:, 1], 1)[0]) # 0.9,和 PC1 的 1.0 不同
🔗 这一章连到哪里
| 去哪 | 为什么 |
|---|---|
| 05c · SVD 与实践 | ⭐ 直接续着本章:本章推出「主成分 = 协方差矩阵的特征向量」,下一章说明为什么没人照着这句话去算(改用 SVD),以及主成分该留几个、什么时候会翻车 |
| 第 5 章 · 维度灾难 | ⭐ 本章是它的出路①的展开:那一章证明了「高维必须降维」,本章给出最经典那个降维做法的全部代数 |
| ML基础 06 · 无监督:聚类与降维 | ⭐ 对面讲怎么用:n_components 怎么设、PCA 与 LDA 的取舍、泄漏怎么防。本章讲的是那些用法凭什么成立 |
| 第 1 章 · 最大似然 | ⚠️ 本章说 PC1 不是回归线 —— 根源就是那一章的建模假设:回归假设 x 已知、只有 y 带噪声,而 PCA 不区分自变量因变量 |
| 第 6 章 · 核技巧 | 本章的推导全程只用到内积。把内积换成核函数就是核 PCA —— 一步升级成非线性降维 |
✅ 检查点
- 协方差矩阵怎么算?为什么第一步的中心化不能省?
- 协方差矩阵的哪两条性质保证了「特征值全是实数且非负、特征向量互相正交」?
- 「投影到方向 w 之后的方差」怎么用协方差矩阵一步写出来?为什么必须约束 ‖w‖=1?
- 拉格朗日推导最后得到什么方程?特征值 λ 的物理含义是什么?
- 「最大化投影方差」和「最小化重构误差」为什么是同一个问题?靠哪条恒等式?
- 为什么 PC1 和 OLS 回归线一般不重合?
- 手算例子里,Σ、两个特征值、解释方差比、PC1 斜率、OLS 斜率分别是多少?
👀 答案
- 先中心化(每列减自己的均值),再 Σ = (1/n)·Xcᵀ Xc。不中心化算出来的是二阶原点矩,它把"数据云离原点多远"也编码了进去,PCA 会找到一个指向数据云中心的假方向——那个方向不含任何信息,只说明你忘了减均值。
- 对称(→ 特征值是实数,且不同特征值的特征向量自动正交,这是谱定理,正交性是白送的)和半正定(因为 wᵀΣw 就是投影后的方差,方差不可能为负 → 特征值全 ≥ 0,可排序)。
- Var(Xc·w) = wᵀΣw。必须约束 ‖w‖=1,否则把 w 放大 10 倍方差就变 100 倍,问题无界;加了约束才是在问「哪个方向最好」而不是「哪个向量最长」。
- Σw = λw(特征方程)。代回目标得 Var = wᵀΣw = λ —— ⭐特征值就是那个方向上的方差,所以"挑方差最大的方向"= "挑最大的特征值"。
- 因为投影和残差互相垂直,勾股给出 ‖x‖² = 投影² + 残差²;对所有样本求平均后左边是总方差 tr(Σ),与 w 无关的定值 → 右边两项此消彼长,投影拉到最大 ⟺ 残差压到最小。
- 因为量的距离不同:回归只量竖直方向的误差(假设 x 已知、只有 y 带噪声),PCA 量垂直于直线的距离(所有维度地位平等)。
- Σ = [[2.0, 1.8], [1.8, 2.0]],特征值 3.8 和 0.2,解释方差比 95% / 5%(分母 tr = 4.0);PC1 斜率 = 1.0(方向 [1,1]/√2),OLS 斜率 = Cov/Var(x) = 1.8/2 = 0.9。
🛑 可以停在这里
⚡ 走神救援
PCA = 把协方差矩阵做特征分解,拿最大的几个特征向量当新坐标轴。 前置是协方差矩阵:先中心化(省了这一步会得到一个指向数据云中心的假方向),再 Σ = (1/n)·Xcᵀ Xc。它对称(→ ⭐不同特征值的特征向量自动正交,主成分的正交性是谱定理白送的)、半正定(因为 wᵀΣw 就是投影后的方差,不可能为负),对角线是各维方差,迹 = 总方差 = 特征值之和(这是"解释方差比"的分母)。⚠️它对单位极其敏感,因为方差的量纲是"单位的平方"。⭐推导一(最大化投影方差):Var(Xc·w) = wᵀΣw,⚠️必须约束 ‖w‖=1(否则把 w 放大十倍方差变 100 倍、问题无界);拉格朗日求导得 Σw = λw —— 主成分只能是协方差矩阵的特征向量;代回得 Var = λ,⭐⭐特征值就是那个方向上的方差。第二主成分只要加上「与 w₁ 正交」再来一遍。⭐推导二(最小化重构误差):投影与残差互相垂直,勾股 ‖x‖² = 投影² + 残差²,左边求平均后是总方差 tr(Σ),一个定值 → 右边两项此消彼长 ⟹ 投影拉到最大 ⟺ 残差压到最小,两条推导必然同解。⚠️PC1 不是回归线:回归只量竖直误差(假设 x 已知、只有 y 带噪声),PCA 量垂直于直线的距离——手算例子里 OLS 斜率 0.9 而 PC1 斜率 1.0,同一批数据。手算例子:X = (1,2)(2,3)(3,5)(4,4)(5,6) → 中心化后 Σ = [[2, 1.8], [1.8, 2]];形如 [[a,b],[b,a]] 的矩阵特征值就是 a ± b,于是 λ = 3.8 / 0.2,特征向量 [1,1]/√2 和 [1,−1]/√2,解释方差比 95% / 5%。三处验算:tr = 4 = 3.8+0.2 ✅、把 5 个点投到 [1,1]/√2 上算出的方差正好是 λ₁ = 3.8 ✅、OLS 斜率 0.9 ≠ PC1 斜率 1.0 ⚠️。
下一节 👉 05c-SVD与实践.md
去那里的理由:本章推出的 Σw = λw 是对的,但没有一个正经实现会照着算 —— 算 XᵀX 这一步会把条件数平方、有效精度砍半。下一章讲真实的 PCA 怎么走 SVD, 顺带回答「主成分留几个」和「什么时候 PCA 会把最有用的那个方向当噪声丢掉」。