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

sklearn PCA.transform gives different results for different trials

我正在使用 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) )

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

现在对于你的情况,当size大于500时,它会选择randomized

svd_solver : string {‘auto’, ‘full’, ‘arpack’, ‘randomized’}

auto :

the solver is selected by a default policy based on X.shape and n_components: if the input data is larger than 500x500 and the number of components to extract is lower than 80% of the smallest dimension of the data, then the more efficient ‘randomized’ method is enabled. Otherwise the exact full SVD is computed and optionally truncated afterwards.

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

尝试使用

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

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