为何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
相关产品推荐
相关产品推荐

