sklearn PCA.transform为不同的试验提供不同的结果

时间:2018-01-05 06:40:39

标签: python-2.7 scikit-learn pca

我正在使用sklearn.decomposition.PCA做一些PCA。我发现如果输入矩阵X很大,PCA.transform的两个不同PCA实例的结果将不一样。例如,当X是100x200矩阵时,就不会有问题。当X是1000x200或100x2000矩阵时,两个不同PCA实例的结果将不同。我不确定原因是什么:我认为sklearn的PCA求解器中没有随机元素?我使用的是sklearn版本0.18.1。用python 2.7

下面的脚本说明了这个问题。

import numpy as np
import sklearn.linear_model as sklin 
from sklearn.decomposition import PCA

n_sample,n_feature = 100,200
X = np.random.rand(n_sample,n_feature)
pca_1 = PCA(n_components=10)
pca_1.fit(X)
X_transformed_1 = pca_1.transform(X)

pca_2 = PCA(n_components=10)
pca_2.fit(X)
X_transformed_2 = pca_2.transform(X)

print(np.sum(X_transformed_1 == X_transformed_2) )
print(np.mean((X_transformed_1 - X_transformed_2)**2) )

2 个答案:

答案 0 :(得分:3)

PCA中有svd_solver个参数,默认情况下它有值" auto"。根据输入数据大小,它选择最有效的求解器。

就你的情况而言,当尺寸大于500时,它会选择randomized

  

svd_solver:string {'auto','full','arpack','randomized'}

     

自动

     

通过基于X.shape和n_components的默认策略选择解算器:如果输入数据大于500x500且   提取的组分数量低于最小的80%   数据的维度,那么更有效的“随机化”方法是   启用。否则,计算确切的完整SVD并且可选地   事后被截断。

要控制随机求解器的行为方式,可以在PCA中设置random_state param,它将控制随机数生成器。

尝试使用

pca_1 = PCA(n_components=10, random_state=SOME_INT)
pca_2 = PCA(n_components=10, random_state=SOME_INT)

答案 1 :(得分:0)

即使使用相同的试用号,我也遇到类似的问题,但是在不同的机器上,将svd_solver设置为'arpack'会得到不同的结果