随机PCA .explained_variance_ratio_在sklearn 0.15.0中总和大于1



当我用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

with '0.14.1'我得到:

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

总和不应大于1

被选择的每个组成部分解释的方差百分比。k是不设置那么所有的组件都存储和解释的总和方差等于1.0

这是怎么回事?

0.14.1中的行为是一个bug,因为它的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

相关内容

  • 没有找到相关文章

最新更新