ML ML Learning Lab
11 / 14
第 11 步 · 把高维压到低维

PCA 降维PCA Dimensionality Reduction

找"方差最大的方向"做投影 — 数据压缩的几何直觉

9 分钟
阅读 + 实操
3 个
交互视图
中级
难度

PCA 降维 · 交互演示

PC1 方差: --
PC2 方差: --
累计保留: --
样本点数 60

为什么学这步?

真实数据往往是高维的(图像、基因表达、用户行为),维度越高越难可视化,也越容易遭遇"维度灾难"。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 — 数学推导与应用概览

📝 课后练习

检验你的理解——答对为止