我正在使用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) )
答案 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
'会得到不同的结果