主成分分析 PCA
一句话定义
主成分分析把数据投影到「方差最大」的少数正交方向上:协方差矩阵的前 k 个特征向量即主成分方向,对应特征值即各方向方差,由此在尽量保留信息的前提下把 p 维压到 k 维。
为什么重要
高维数据的可视化、去噪、去共线、加速下游模型都靠它;「方差 = 信息」的谱系视角(PCA 与 SVD、核 PCA、因子分析、甚至流形学习的联系)是无监督学习的数学主脉之一。它也是面试与工程中出镜率最高的降维方法,推导是线性代数的最佳练兵场。
前置知识
线性回归与最小二乘法 的线性代数基础;特征值/特征向量、协方差矩阵、瑞利商概念。
核心概念
- 协方差矩阵:S = 1n Xc^⊤ Xc(Xc 为中心化数据),对称半正定。
- 主成分(PC):S 的特征向量方向,按特征值从大到小排列。
- 解释方差比:λi / ∑j λj,第 i 个主成分承载的信息份额。
- 载荷(loading):主成分在原特征上的系数,用于解释成分含义。
- 重构误差:投影后恢复数据的损失,等价视角见推导。
- 两个关键前提:先中心化;特征量纲悬殊时先标准化(否则大量纲特征垄断第一主成分)。
直观类比
给一堆三维雕塑拍一张最有信息量的二维照片:应该从「雕塑最舒展」的方向拍——这样照片上轮廓变化最大(方差最大)。PCA 就是在 p 维空间里依次找「最舒展的方向」,然后沿这些方向压扁保存;正交约束保证每个新方向补的都是「还没拍到的」变化。
原理与机制
最大方差推导:第一主成分方向 u1 最大化投影方差 1n∑i (u1^⊤ xi)2 = u1^⊤ S u1(已中心化),约束 ‖ u1 ‖ = 1。拉格朗日函数 u1^⊤ S u1 - λ(u1^⊤ u1 - 1) 求导置零得 S u1 = λ u1——最优方向必是特征向量,代回得方差恰为特征值 λ1,故取最大特征值方向。第二主成分在与 u1 正交的约束下重复该论证,依次类推。等价的最小重构误差视角:保留前 k 个成分是所有秩 k 线性投影中重构平方误差最小者(Eckart-Young 定理的 PCA 面相),两种目标互为镜像。
与 SVD 的关系:对中心化数据矩阵做 SVD Xc = U Σ V^⊤,则 V 的列是主成分方向、V Σ2 / n 的对角元是特征值——sklearn 的 PCA 正是用 SVD 实现,数值上更稳定。
几何/统计含义:主成分互相不相关(协方差矩阵在对角化后变成对角阵),第一个 PC 捕捉最大线性变化轴;特征值接近 0 的方向是「数据几乎不变的方向」,裁掉它们即去共线(与 kp-008 的岭回归互为替身)。
公式与推导
累计解释方差 ∑i=1k λi / ∑j=1p λj 达到阈值(如 95%)时选 k;另一种选法是碎石图找肘点。投影与重构:z = Uk^⊤ x,x̂ = Uk z。
图示
y
│ ● ● u₂(次要方向,方差小)
│ ●●● ●╱ ●
│ ●● ●╱●● ╱ u₁(第一主成分:数据最舒展方向)
│●●●╱●●●
│ ╱●
└───────────────▶ x
投影到 u₁ → 一维表示保留绝大部分变化实例或案例
高维数据降维并检查解释方差:
from sklearn.datasets import load_breast_cancer
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
import numpy as np
X, _ = load_breast_cancer(return_X_y=True)
pca = make_pipeline(StandardScaler(), PCA()).fit(X) # 标准化必须在前
ratio = pca.named_steps["pca"].explained_variance_ratio_
print("前5个PC解释方差比:", np.round(ratio[:5], 3))
print("累计到95%需要 PC 数:", np.argmax(np.cumsum(ratio) >= 0.95) + 1, "/", len(ratio))30 维通常可压到约 10 个主成分而保留 95% 方差——后续建模或可视化成本大幅下降。
常见误区
- 不标准化就做 PCA:收入(元)与年龄(岁)混在一起,第一主成分几乎就是收入轴;比较量纲必须先标准化。
- 把主成分当可解释业务变量:PC 是原特征的线性混合,跨业务解释要在载荷上花功夫。
- 用 PCA「预测」目标变量:PCA 无监督,方差大的方向未必与标签相关;监督场景应看 kp-028 的监督筛选。
- 在测试数据上重新拟合 PCA:均值与成分必须用训练集拟合、测试集只做变换(泄漏防线,见 kp-025/029)。
与其他知识点的关系
正则化:岭回归、Lasso 与弹性网 的岭回归与 PCA 是同一谱问题的两种截断(特征值收缩 vs 硬裁剪);DBSCAN 与层次聚类 中 PCA 常作聚类前处理;特征工程:编码、缩放与缺失值处理 的标准化是 PCA 的前置工序;核技巧与常用核函数 的核 PCA 把线性投影推广到非线性流形。
自测题
- 用拉格朗日乘子法推导第一主成分方向。
- 要点:最大化 u^⊤ S u s.t. ‖ u ‖ = 1,一阶条件 Su = λ u,最优解取最大特征值对应的特征向量。
- 为什么 PCA 前必须中心化?何时还必须标准化?
- 要点:协方差以均值为原点,不中心化第一主成分会指向均值方向;特征量纲不同时需标准化,否则大量纲特征垄断方差。
- PCA 降维会损失什么信息?举例说明可能有害的场景。
- 要点:丢掉低方差方向;若某低方差方向恰好与判别信息相关(如细分类的细微特征),降维会伤预测——方差 ≠ 与标签相关的信息。
延伸阅读
Hastie 等《The Elements of Statistical Learning》第 14.5 节;Jolliffe《Principal Component Analysis》第 2、3 章。