R 的 prcomp() 和 Python 的 PCA() 的区别

1. 数据标准化

  • R 的 prcomp():
    a. 默认对数据进行中心化(减去均值)
    b. 可以通过 scale=TRUE 参数对数据进行标准化(除以标准差)
prcomp(x, retx = TRUE, center = TRUE, scale. = FALSE,
       tol = NULL, rank. = NULL, ...)
  • Python 的 PCA():
    a. 默认不进行数据标准化,需要手动使用 StandardScaler() 进行标准化
class sklearn.decomposition.PCA(n_components=None, *, copy=True, whiten=False, svd_solver='auto', tol=0.0, iterated_power='auto', n_oversamples=10, power_iteration_normalizer='auto', random_state=None)

# example
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
data_scaled = StandardScaler.fit_transform(data)
pca_result = pca.fit_transform(data_scaled)

2. 输出结果

  • R 的 prcomp() 返回一个 prcomp 对象,包含以下组件:
    x:如果 retx=TRUE,返回旋转后的数据(中心化(和标准化)的数据乘以 rotation 矩阵)
    rotation:变量负载矩阵(即一个其列包含特征向量的矩阵)
    sdev:主成分的标准差,也就是协方差/相关性矩阵的特征向量的平方根,尽管实际计算是用数据矩阵的奇异值完成的
    center,scale:使用的中心化和标准化,或 FALSE
  • Python 的 PCA() 返回一个 PCA 对象,主要包含以下属性:
    components_:shape=(n_componets, n_features),特征空间的主轴,表示数据中最大方差的方向。等价于中心化的输入数据的右奇异向量,平行于它的特征向量。成分以降序的 explained_variance_ 排列。
    explained_variance_:由每个被选择的组分解释的方差,方差估计使用 n_samples -1 的自由度。等于 X 的协方差矩阵的 n_componets 个最大特征向量。
    explained_variance_ratio_:由每个选择的组分解释的方差的百分比(方差贡献率)。如果 n_components 没有被设置,将保留所有成分且其和等于 1.0
    singular_values_:每个被选择的组分的奇异值,奇异值等于低维空间中 n_components 变量的 2-norms
    mean_:数据的均值(中心化参数)
    n_componets_:实际保留的主成分数量
    3. 主成分数量
  • R 的 prcomp() 默认保留所有可能的主成分(最多为特征数量),可以通过 rank. 参数指定保留的主成分数量
  • Python 的 PCA() 默认保留所有可能的主成分,最多为 min(n_samples, n_features),可通过 n_components 参数指定保留的主成分数量

两种方法的结果比较
这两种方法生成的降维矩阵有略微的差别,主要是因为 R 在对数据进行标准化时用的是无偏的样本标准差,StandardScaler() 用的是有偏的总体标准差,相当于 numpy.std(x, ddof=0),但 ddof 的选择不太可能影响模型性能。

来自官网的说明

代码参考

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容