You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何scikit-learn中PCA.fit_transform与手动计算结果不一致?

为什么两种PCA投影方式结果不同?

核心原因是:scikit-learn的PCA.fit_transform()会自动对数据做中心化预处理,而直接用np.dot(X, pca.components_.T)跳过了这一步,直接用原始数据计算投影,所以结果不一致。

具体来说,PCA的标准计算流程包含中心化步骤:

  • 先计算训练集数据的均值pca.mean_
  • 将原始数据减去均值,得到中心化后的数据:X_centered = X - pca.mean_
  • 用中心化后的数据点乘主成分矩阵的转置,得到最终投影结果

fit_transform()内部就是按照这个完整流程执行的。如果想手动复现fit_transform的结果,必须补上中心化步骤:

from sklearn.decomposition import PCA
import numpy as np

pca = PCA(n_components=0.95)
X_proj = pca.fit_transform(X)

# 手动复现fit_transform的结果
X_centered = X - pca.mean_
X_proj_manual = np.dot(X_centered, pca.components_.T)

# 此时两者结果完全一致
print(np.allclose(X_proj, X_proj_manual))  # 输出 True

额外说明:如果初始化PCA时设置了whiten=True,还会额外做缩放处理,但默认whiten=False,所以绝大多数场景下,差异都来自中心化步骤。

内容的提问来源于stack exchange,提问作者Don Kim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 10:04:50