PCA 降维:用主成分压缩特征
高维特征常带来冗余、计算压力,也容易让模型过拟合——这就是常说的「维度灾难」:维度越高,单位体积内的样本越稀疏,距离度量越失效。主成分分析(PCA)用一组正交的新轴替换原特征,这些新轴按方差从大到小排列;取前 k 个,就能用更少维度保留大部分信息。它本质是一种线性变换:在尽量保留样本间差异的前提下,把数据投影到一个更低维的子空间。PCA 既能给训练提速、给可视化降维(二维/三维散点),也能通过丢弃低方差成分起到一定去噪作用,是数据预处理里最常用的一步。
核心思路
PCA 的几何直觉是:为数据找一个新的坐标系,使样本在第一根轴上投影的方差最大,在第二根轴上方差次大且与第一根轴正交,依此类推。方差大意味着该方向承载了最多的「变化信息」。从线性代数看,主成分就是数据协方差矩阵的特征向量,对应的特征值就是该方向上的方差大小——所以 PCA 等价于「求协方差矩阵的前 k 个特征向量」。具体步骤:
- 中心化:每个特征减去其均值,让数据以原点为中心(PCA 对均值敏感,不中心化会得到偏向均值的主轴)。
- 标准化(通常必须):不同量纲的特征先除以标准差(StandardScaler),否则数值范围大的维度会主导主轴。
- 算协方差矩阵并求其特征向量与特征值;特征值大小就对应各主成分的方差。
- 按特征值降序取前 k 个特征向量,它们就是「主成分」方向。
- 投影:用这 k 个主成分组成的矩阵把数据变换到低维表示。
用 scikit-learn 一行即可完成:
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
X_scaled = StandardScaler().fit_transform(X)
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)
print(pca.explained_variance_ratio_) # 每个主成分解释的方差占比
print(pca.components_) # 主成分 = 原特征的线性组合权重
若想消除各成分间的尺度差,可在 PCA(whiten=True) 开启白化,把各主成分方差归一化——这在把 PCA 当作下游模型(如 SVM)的预处理时常用。
怎么选 k
最常用「累计解释方差比」:选最小的 k,使前 k 个主成分解释的累计方差达到阈值(常用 0.95,即保留约 95% 的信息)。sklearn 里可这样算:
pca = PCA().fit(X_scaled)
cum = pca.explained_variance_ratio_.cumsum()
k = (cum >= 0.95).argmax() + 1
也可用拐点法(scree plot):把特征值从大到小画成折线,在曲线明显「变平」的拐点处截断——它对应「再加一个主成分边际收益骤降」的位置。实践里常把两种方法结合:先由累计方差定下限,再按业务可解释性微调。注意 explained_variance_ratio_ 是相对值,绝对方差随数据缩放变化,所以标准化那一步不能省;否则选出的 k 会失真,甚至在不同预处理下给出相反结论。另外,0.95 不是铁律——可视化用 2~3 维即可,而作为预处理则可在保住下游性能的前提下尽量压低 k。
适用与局限
- 只对线性结构有效:PCA 捕捉的是线性相关性。若数据呈明显非线性流形(如经典的「瑞士卷」),PCA 会把不同层压扁到一起,此时应改用**核 PCA(KernelPCA)**或流形学习(t-SNE、UMAP)。
- 对尺度敏感:必须先标准化,否则量纲大的特征主导主轴,结果毫无意义。
- 不保证类别可分:PCA 只看方差、不考虑标签,降维后不同类别可能重叠;若目标是让类间分得开,应优先考虑 LDA(线性判别分析)。
- 新数据可稳定投影:PCA 学到的是固定线性变换,
pca.transform()能把 unseen 数据映射到同一低维空间——这区别于 t-SNE/UMAP,后者主要面向可视化,对新样本没有稳定、可复用的变换。 - 必然有信息损失:降维一定会丢细节,需结合下游任务评估是否够用;
inverse_transform可近似还原数据,用来直观检查丢了哪些结构。 - 解释性有限:主成分是原特征的线性组合,权重分散时很难用业务语言解释「第 3 主成分代表什么」;可用载荷(loading)大小挑出贡献最大的原特征做近似解释。
工程上的典型用法
- 预处理提速:在 kNN、SVM 等受维度影响大的模型前先做 PCA,可显著降低计算量,有时还能因去噪而提升泛化。
- 可视化:把高维数据压到 2 维画散点,快速肉眼检查聚类或异常点。
- 去噪:丢弃解释方差极小(接近噪声)的成分,再用
inverse_transform还原,得到平滑后的数据。 - 稀疏数据:文本等稀疏高维数据可用
TruncatedSVD(不必先中心化,避免破坏稀疏性)替代 PCA。
小结
PCA 通过方差最大化把高维特征压缩到低维,是预处理、去噪与可视化的常用手段。先标准化、再按累计方差比或拐点选 k,可用最少维度保留主要信息,并支持对新数据一致投影。理解它的线性假设、对尺度的敏感与信息损失边界,并知道在非线性或需可分性时改用核 PCA / UMAP / LDA,才能在降维与保真之间做出合理取舍。
参考与延伸阅读
- scikit-learn 官方文档:PCA 与降维模块。已核验。https://scikit-learn.org/stable/modules/decomposition.html
- 论文 Visualizing Data using t-SNE(van der Maaten & Hinton, 2008, JMLR)。已核验。https://www.jmlr.org/papers/v9/v9lmaaten08a.html
- UMAP 官方文档。已核验。https://umap-learn.readthedocs.io/
- 《Pattern Recognition and Machine Learning》PCA 章节(Bishop)。待核实具体页码。