Principal Component Analysis (PCA)
主成分分析 (PCA) 会将数据投影到能够捕获最大方差的正交方向上。了解其工作原理、如何选择 k、应用和代码。
主成分分析 (PCA) 是一种线性降维技术,它将数据重新表示为新的、不相关的变量,称为主成分,并按每个主成分所捕获的数据方差大小排序。只保留前几个主成分,就可以将许多相关特征压缩为少数几个,同时保留大部分信息。Karl Pearson 于 1901 年提出了这一方法,Harold Hotelling 随后进一步发展该方法,并于 1933 年为其命名。PCA 是一种无监督技术,不使用标签;它是常见的数据预处理步骤,也是将高维数据压缩到二维或三维进行快速可视化的方法,并且可作为机器学习中的压缩和降噪基线。
PCA 的工作原理#
PCA 首先通过减去均值对每个特征进行中心化。第一主成分是中心化数据变化最大的方向;此后的每个主成分都是与之前所有主成分正交、且剩余方差最大的方向。主成分是数据协方差矩阵的特征向量,对应的特征值则是沿这些方向的方差;各个库会通过对中心化数据进行奇异值分解 (SVD) 来计算两者,这比直接构造协方差矩阵具有更好的数值稳定性。将数据投影到前 k 个主成分上,即可获得降维表示;再将其映射回原空间,就能重建原始数据的近似值。在所有投影到 k 维空间的线性投影中,PCA 的平方重建误差最小。
方差取决于单位,因此对于收入(以美元计)和年龄(以年计)等使用不同尺度测量的特征,应先进行标准化;否则,数值范围最大的特征会主导第一主成分。通常根据解释方差比来选择主成分数量 k:保留主成分,直到累计方差占比达到 95% 等目标;也可以根据碎石图中每个主成分方差的拐点进行选择。
Scikit-learn 的 PCA可以直接接受方差目标。此示例会压缩手写数字的 8×8 图像:
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
# 1,797 handwritten digits, each an 8x8 image flattened to 64 pixel values
X, _ = load_digits(return_X_y=True)
# Keep the fewest components that explain 95% of the variance
pca = PCA(n_components=0.95)
X_reduced = pca.fit_transform(X)
print(f"{X.shape[1]} features -> {pca.n_components_} components")
print(f"First two components: {pca.explained_variance_ratio_[:2].sum():.1%} of the variance")29 个主成分保留了 64 个像素中 95% 的方差,将输入规模缩小了一半以上;仅前两个主成分就包含 28.5% 的方差。之所以方差集中在少数主成分上,是因为相邻像素之间高度相关,而且图像左右边缘的像素几乎没有变化。
局限性#
PCA 只能发现线性结构,因此,位于曲面上的数据需要比其真实维度更多的主成分。每个主成分都会混合所有原始特征,因此难以解释;平方距离还会让少数离群点左右结果。高方差也不等于高价值:低方差方向可能包含区分两个类别的信号,因此丢弃它可能损害分类器,即使损失的方差很少。将大量特征缩减为少数特征,仍有助于应对维度灾难:随着特征数量增加,模型要实现泛化就需要多得多的样本;当特征很多、样本很少时,这也能限制过拟合。
计算机视觉中的嵌入向量 PCA#
视觉模型用嵌入向量描述每张图像或每个对象,每个向量包含数百个数字;PCA 常用于绘图、聚类或压缩这些向量。YOLO26模型通过 model.embed() 为每张图像返回一个嵌入向量,将这些向量投影到前两个主成分上,就能快速线性展示经过自定义训练的模型如何区分类别。将存储的嵌入向量降至更低维度,还能缩小向量数据库的索引,并加快向量搜索。
应用场景#
- 人脸识别:Turk 和 Pentland(1991)提出的特征脸方法,用一组人脸图像的主成分坐标表示每张人脸,并通过比较这些坐标来识别人。
- 异常检测:工业过程监控会用正常运行时的传感器数据拟合 PCA;当新读数的重建效果很差,或在保留的主成分方向上偏离很远时,就会触发警报。
- 群体遗传学:基因型数据的 PCA 可概括祖源;一项 2008 年针对 1,387 名欧洲人的研究发现,前两个主成分重现出一幅清晰可辨的欧洲地图。
- 利率风险:债券收益率曲线的变化主要由三个主成分支配,分析师称其为水平、斜率和曲率,因此风险模型跟踪这三个数值,而非每个期限的数值。
PCA 与相关技术的比较#
- t-SNE 和 UMAP:这类非线性方法专为可视化设计,能够保留局部邻域,使簇之间更清晰地分开,但相距较远的簇之间的距离则失去意义。Scikit-learn 的 t-SNE 无法转换新数据点,而拟合后的 PCA 只需一次矩阵乘法即可投影新数据。
- 自编码器:这类神经网络压缩并重建数据,还能学习非线性结构。使用平方误差训练的线性自编码器学到的子空间与 PCA 相同。
- 特征选择与特征提取:特征选择保留原始列的一个子集,因此结果仍易于解释;而 PCA 作为经典的特征提取方法,会构造融合所有原始特征的新特征。
- 线性判别分析(LDA):这是一种有监督的相关方法,它选择能最大化类别间分离度而非总方差的方向,且生成的主成分数量最多比类别数量少一个。










