第 11 步 · 把高维压到低维
PCA 降维PCA Dimensionality Reduction
找"方差最大的方向"做投影 — 数据压缩的几何直觉
9 分钟
阅读 + 实操
3 个
交互视图
中级
难度
PCA 降维 · 交互演示
PC1 方差: --
PC2 方差: --
累计保留: --
为什么学这步?
真实数据往往是高维的(图像、基因表达、用户行为),维度越高越难可视化,也越容易遭遇"维度灾难"。PCA 是最经典的无监督降维方法:找出方差最大的几个方向,把高维数据"压"到低维,同时尽量保留信息。它是 ML 流程里最常见的预处理步骤之一。
📌 发生了什么
- 计算数据的协方差矩阵,描述各维度间的方差与相关性。
- 求特征值与特征向量,特征值大小 = 该方向方差。
- 把数据投影到前 k 个主成分方向上,实现降维。
⚠️ 常见陷阱
- PCA 一定能提升分类效果?不一定,它是无监督的,方差大≠对分类有用。
- 不做标准化也能 PCA?危险,量纲不同的维度会霸占主成分。
- PCA 能处理任意结构?不能,它只捕捉线性结构。
✅ 本章小结
- 协方差矩阵:PCA 的起点,描述维度间的方差与相关性。
- 特征值 / 特征向量:特征值 = 方差,特征向量 = 主成分方向。
- 投影 + 重建:用前 k 个主成分重建,损失 = 被丢弃方向的方差。
📐 PCA 协方差矩阵特征分解
PCA 通过对协方差矩阵做特征分解,找到方差最大的方向(主成分)。
对协方差矩阵做特征分解 C v = λ v,特征值 λ 代表该方向的方差:
取前 k 个最大特征值对应的特征向量组成投影矩阵 W,将数据投影到 k 维:
重建与信息保留率:被丢弃方向的方差之和占总方差的比例:
🎛 主成分数量 k 的选择
k 决定保留多少信息。k 越大信息越完整但压缩越少,k 越小压缩越大但损失越多。
| 主成分数 k | 表现 | 结果 |
|---|---|---|
| k = 1 | 压缩过度,丢失大量信息 | 欠保留 |
| k = 2 | 可可视化,保留主要结构 | 推荐(可视化) |
| k = d/2 | 平衡压缩与信息保留 | 推荐(压缩) |
| k = d | 无压缩,保留全部方差 | 无降维 |
💡 经验法则:选最小的 k 使得累计方差保留率 ≥ 95%。
💻 协方差矩阵 + 特征分解 + 投影
PCA 的核心实现:中心化、协方差矩阵、特征分解、投影(Python):
import numpy as np
# PCA 主流程
def pca(X, k):
# 1. 中心化:减去均值
mean = X.mean(axis=0)
Xc = X - mean
# 2. 计算协方差矩阵 C = (1/n) Xc^T Xc
n = Xc.shape[0]
C = (Xc.T @ Xc) / n
# 3. 特征分解(实际中用 SVD 更稳定)
eigenvalues, eigenvectors = np.linalg.eigh(C)
# 4. 按特征值降序排列,取前 k 个
idx = np.argsort(eigenvalues)[::-1][:k]
W = eigenvectors[:, idx] # 投影矩阵
# 5. 投影到 k 维
Z = Xc @ W
return Z, W, mean, eigenvalues
# 方差保留率
def retained_variance(eigenvalues, k):
total = eigenvalues.sum()
top_k = np.sort(eigenvalues)[::-1][:k].sum()
return top_k / total
📚 参考文献与延伸阅读
- Pearson, K. (1901). On Lines and Planes of Closest Fit to Systems of Points in Space. — PCA 的原始论文
- Jolliffe, I. T. (2002). Principal Component Analysis. Springer — PCA 的完整理论专著
- scikit-learn: PCA — 工业实现与 SVD 加速
- Wikipedia: Principal component analysis — 数学推导与应用概览
📝 课后练习
检验你的理解——答对为止