R与Python中PCA结果差异原因及Python结果解读咨询
R与Python PCA结果差异解析及Python结果解读
核心问题
针对16行观测样本、11列特征的数据集做PCA时,R的prcomp与Python sklearn的PCA存在以下差异,但核心解释能力一致:
- 矩阵维度:
prcomp返回的结果矩阵是特征行、主成分列;sklearn返回的是观测样本行、主成分列 - 特征值、成分载荷数值有差异,但方差解释累积和、特征与主成分的相关性完全一致
差异产生的原因
1. 矩阵维度定义不同
R的prcomp中,rotation属性是特征×主成分的矩阵,代表每个特征在各主成分上的载荷;而sklearn的pca.components_是主成分×特征的矩阵(即R中rotation的转置)。
2. 特征值计算的缩放差异
R的prcomp基于**样本协方差矩阵(除以n-1)计算特征值(sdev的平方就是特征值);而sklearn的PCA默认基于总体协方差矩阵(除以n)**计算特征值(对应explained_variance_)。两者的转换关系为:R的特征值 = sklearn特征值 × n/(n-1)
以补充结果为例,PC1的sklearn特征值是15.418,乘以16/15(n=16)后约为16.44,这就是R中对应的特征值。
3. 主成分方向的符号差异
PCA的主成分方向是任意的,正负号不影响方差解释能力——只要载荷的相对大小、特征与主成分的相关性一致,符号翻转是完全合理的。这也是两者载荷数值存在差异的常见原因。
Python PCA结果解读
sklearn的PCA输出可从以下几个核心属性理解:
data_pca = pca.fit_transform(data_scaled):维度为**(样本数×主成分数)**,每一行代表一个样本在主成分空间的投影坐标pca.components_:维度为**(主成分数×特征数)**,每一行是对应主成分的特征载荷(即特征与该主成分的相关系数,数据已标准化)pca.explained_variance_:每个主成分的方差(基于总体协方差矩阵的特征值)pca.explained_variance_ratio_:每个主成分解释的方差占总方差的比例,累积和代表前k个主成分的总解释能力,这和R的结果完全一致
如果要对齐R的rotation矩阵,只需将pca.components_转置,同时可根据需求调整符号(不影响解释),并将特征值转换为样本协方差版本(乘以n/(n-1))。
代码示例
R代码
data_pca <- prcomp(data, scale = TRUE)
Python代码
from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA scaler = StandardScaler() data_scaled = scaler.fit_transform(data) pca = PCA() data_pca = pca.fit_transform(data_scaled)
补充结果(转置后)
| explained_variance | explained_variance_ratio | cumulative_sum | |
|---|---|---|---|
| PC1 | 1.541840e+01 | 8.760452e-01 | 0.876045 |
| PC2 | 6.401815e-01 | 3.637395e-02 | 0.912419 |
| PC3 | 5.191492e-01 | 2.949711e-02 | 0.941916 |
| PC4 | 4.163386e-01 | 2.365560e-02 | 0.965572 |
| PC5 | 3.616688e-01 | 2.054936e-02 | 0.986121 |
| PC6 | 9.329659e-02 | 5.300943e-03 | 0.991422 |
| PC7 | 8.263950e-02 | 4.695426e-03 | 0.996118 |
| PC8 | 4.770578e-02 | 2.710556e-03 | 0.998828 |
| PC9 | 1.481567e-02 | 8.417995e-04 | 0.999670 |
| PC10 | 5.808094e-03 | 3.300053e-04 | 1.000000 |
| PC11 | 8.392454e-33 | 4.768440e-34 | 1.000000 |
内容的提问来源于stack exchange,提问作者isturdyb
相关产品推荐
相关产品推荐

