【问题标题】:sklearn PCA.transform gives different results for different trialssklearn PCA.transform 为不同的试验给出不同的结果
【发布时间】:2018-06-14 23:06:40
【问题描述】:

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

【问题讨论】:

  • 尝试使用random_state参数:pca_1 =PCA(n_components=10, random_state=42)

标签: python-2.7 scikit-learn pca


【解决方案1】:

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

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

svd_solver : 字符串 {‘auto’, ‘full’, ‘arpack’, ‘randomized’}

自动

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

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

尝试使用

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-06-25
      • 2018-11-28
      • 1970-01-01
      • 2016-04-22
      • 1970-01-01
      • 2017-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多