随机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

使用“ 0.14.1”,我得到:

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

The sum should not be greater than 1

Percentage of variance explained by each of the selected components. k
is not set then all components are stored and the sum of explained
variances is equal to 1.0

这里发生了什么?

解决方法:

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
上一篇:python-TypeError网格搜索


下一篇:PCA人脸识别GUI(ORL+Yale人脸库)