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 的选择不太可能影响模型性能。
来自官网的说明