🏠 总目录📚 本教程 05b · PCA 的推导
📑 本页目录(点开跳转)

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(95%)PC2(5%)样本 x到中心的距离投影长度残差(重构误差)μ投影后方差最大 = 数据云拉得最长的方向到中心距离² = 投影² + 残差²,左边是定值⭐ 左边固定 → 投影拉到最大 ⟺ 残差压到最小:两种推导必然同解
⭐ 左图是「最大化投影方差」的视角:PC1 是数据云拉得最长的那根轴。右图是「最小化重构误差」的视角:投影与残差互相垂直,勾股定理里斜边是定值,所以两个目标此消彼长、必然同解。

⚠️ 一个非常常见的误解: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 —— 一步升级成非线性降维

✅ 检查点

  1. 协方差矩阵怎么算?为什么第一步的中心化不能省?
  2. 协方差矩阵的哪两条性质保证了「特征值全是实数且非负、特征向量互相正交」?
  3. 「投影到方向 w 之后的方差」怎么用协方差矩阵一步写出来?为什么必须约束 ‖w‖=1?
  4. 拉格朗日推导最后得到什么方程?特征值 λ 的物理含义是什么?
  5. 「最大化投影方差」和「最小化重构误差」为什么是同一个问题?靠哪条恒等式?
  6. 为什么 PC1 和 OLS 回归线一般不重合?
  7. 手算例子里,Σ、两个特征值、解释方差比、PC1 斜率、OLS 斜率分别是多少?
👀 答案
  1. 先中心化(每列减自己的均值),再 Σ = (1/n)·Xcᵀ Xc。不中心化算出来的是二阶原点矩,它把"数据云离原点多远"也编码了进去,PCA 会找到一个指向数据云中心的假方向——那个方向不含任何信息,只说明你忘了减均值。
  2. 对称(→ 特征值是实数,且不同特征值的特征向量自动正交,这是谱定理,正交性是白送的)和半正定(因为 wᵀΣw 就是投影后的方差,方差不可能为负 → 特征值全 ≥ 0,可排序)。
  3. Var(Xc·w) = wᵀΣw。必须约束 ‖w‖=1,否则把 w 放大 10 倍方差就变 100 倍,问题无界;加了约束才是在问「哪个方向最好」而不是「哪个向量最长」。
  4. Σw = λw(特征方程)。代回目标得 Var = wᵀΣw = λ —— ⭐特征值就是那个方向上的方差,所以"挑方差最大的方向"= "挑最大的特征值"。
  5. 因为投影和残差互相垂直,勾股给出 ‖x‖² = 投影² + 残差²;对所有样本求平均后左边是总方差 tr(Σ),与 w 无关的定值 → 右边两项此消彼长,投影拉到最大 ⟺ 残差压到最小
  6. 因为量的距离不同:回归只量竖直方向的误差(假设 x 已知、只有 y 带噪声),PCA 量垂直于直线的距离(所有维度地位平等)。
  7. Σ = [[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 会把最有用的那个方向当噪声丢掉」。

打卡记录保存在你的浏览器里,首页能看到总进度