sklearn PCA.transform 对于不同的试验给出不同的结果

liz*_*man 3 pca python-2.7 scikit-learn

我正在使用 sklearn.decomposition.PCA 进行一些 PCA。我发现如果输入矩阵X很大,两个不同PCA实例进行PCA.transform的结果将不一样。例如,当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) )
Run Code Online (Sandbox Code Playgroud)

Viv*_*mar 6

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

\n\n

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

\n\n
\n

svd_solver : 字符串 {\xe2\x80\x98auto\xe2\x80\x99, \xe2\x80\x98full\xe2\x80\x99, \xe2\x80\x98arpack\xe2\x80\x99, \xe2\x80\x98randomized\ xe2\x80\x99}

\n\n

汽车

\n\n

求解器由基于 X.shape 和 n_components 的默认策略选择:如果输入数据大于 500x500 并且要提取的组件数量低于数据最小维度的 80%,则启用更高效的\xe2\x80\x98随机\xe2\x80\x99方法。否则,将计算精确的完整 SVD,然后选择性地截断。

\n
\n\n

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

\n\n

尝试使用

\n\n
pca_1 = PCA(n_components=10, random_state=SOME_INT)\npca_2 = PCA(n_components=10, random_state=SOME_INT)\n
Run Code Online (Sandbox Code Playgroud)\n