【问题标题】:Randomized PCA .explained_variance_ratio_ sums to greater than one in sklearn 0.15.0sklearn 0.15.0 中的随机 PCA .explained_variance_ratio_ 总和大于一
【发布时间】:2014-09-12 14:13:02
【问题描述】:

当我使用 sklearn.__version__ 0.15.0 运行这段代码时,我得到了一个奇怪的结果:

import numpy as np
from scipy import sparse
from sklearn.decomposition import RandomizedPCA

a = np.array([[1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
              [1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
              [0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
              [1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
              [1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
              [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
              [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0],
              [1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
              [1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]])

s = sparse.csr_matrix(a)

pca = RandomizedPCA(n_components=20)
pca.fit_transform(s)

使用 0.15.0 我得到:

>>> pca.explained_variance_ratio_.sum()
>>> 2.1214285714285697

使用 '0.14.1' 我得到:

>>> pca.explained_variance_ratio_.sum()
>>> 0.99999999999999978

The sum should not be greater than 1

每个选定组件解释的方差百分比。 ķ 未设置,则存储所有组件并解释的总和 方差等于 1.0

这是怎么回事?

【问题讨论】:

  • 对我来说似乎是一个错误,您可以发布issue
  • 我在这里添加了一个:github.com/scikit-learn/scikit-learn/issues/3469。你能发布 numpy、scipy 和你的线性代数(BLAS/ATLAS/LAPACK/等)库的版本信息吗?
  • 0.14.1 中的行为是一个错误,因为无论截断如何,总和始终为 1.0。在 0.15.0 中解释的方差大于 1.0 的事实也是一个错误。但是一个不同的......

标签: python scikit-learn pca


【解决方案1】:

0.14.1 中的行为是一个错误,因为它的 explained_variance_ratio_.sum() 过去总是返回 1.0,而不管要提取的组件数量(截断)。在 0.15.0 中,这已针对密集数组进行了修复,如下所示:

>>> RandomizedPCA(n_components=3).fit(a).explained_variance_ratio_.sum()
0.86786547849848206
>>> RandomizedPCA(n_components=4).fit(a).explained_variance_ratio_.sum()
0.95868429631268515
>>> RandomizedPCA(n_components=5).fit(a).explained_variance_ratio_.sum()
1.0000000000000002

您的数据排名第 5(100% 的方差由 5 个分量解释)。

如果你尝试在稀疏矩阵上调用RandomizedPCA,你会得到:

DeprecationWarning: Sparse matrix support is deprecated and will be dropped in 0.16. Use TruncatedSVD instead.

在稀疏数据上使用 RandomizedPCA 是不正确的,因为我们无法在不破坏稀疏性的情况下使数据居中,这会在实际大小的稀疏数据上炸毁内存。但是 PCA 需要居中。

TruncatedSVD 将在稀疏数据上为您提供正确的解释方差比(但请记住,它与 PCA 在密集数据上的作用并不完全相同):

>>> TruncatedSVD(n_components=3).fit(s).explained_variance_ratio_.sum()
0.67711305361490826
>>> TruncatedSVD(n_components=4).fit(s).explained_variance_ratio_.sum()
0.8771350212934137
>>> TruncatedSVD(n_components=5).fit(s).explained_variance_ratio_.sum()
0.95954459082530097

【讨论】:

  • 我相信这个答案回答了我的另一个问题stackoverflow.com/questions/16660771/…explained_variance_ratio_ 部分,您介意将此信息添加到该答案(这是您的答案)以便我接受吗?
猜你喜欢
  • 2017-07-19
  • 2014-04-12
  • 2018-01-18
  • 1970-01-01
  • 2014-01-16
  • 2018-09-11
  • 2019-08-02
  • 2021-03-24
  • 2016-07-23
相关资源
最近更新 更多