首页 > 解决方案 > 为什么 Sklearn TruncatedSVD 的解释方差比不是按降序排列的?

问题描述

为什么Sklearn.decomposition.TruncatedSVD解释的方差比不按奇异值排序?

我的代码如下:

X = np.array([[1,1,1,1,0,0,0,0,0,0,0,0,0,0],
           [0,0,1,1,1,1,1,1,1,0,0,0,0,0],
           [0,0,0,0,0,0,1,1,1,1,1,1,0,0],
           [0,0,0,0,0,0,0,0,0,0,1,1,1,1]])
svd = TruncatedSVD(n_components=4)
svd.fit(X4)
print(svd.explained_variance_ratio_)
print(svd.singular_values_)

结果:

[0.17693405 0.46600983 0.21738089 0.13967523]
[3.1918354  2.39740372 1.83127499 1.30808033]

我听说奇异值意味着该组件可以解释多少数据,所以我认为解释的方差比也遵循奇异值的顺序。但比率不是按降序排列的。

有人可以解释为什么会这样吗?

标签: pythonscikit-learnsvd

解决方案


听说奇异值表示组件能解释多少数据

这适用于 PCA,但对于(截断的)SVD 并不完全正确;在某个属性甚至不可用(2014 - 强调我的)的那一天,从相关的Github 线程中引用:explained_variance_ratio_TruncatedSVD

保留方差不是没有居中的截断 SVD 的确切目标函数

因此,奇异值本身确实按降序排序,但如果数据未居中,则这不一定适用于相应的解释方差比。

但是,如果我们之前确实将数据居中,那么解释的方差比实际上是按降序排序的,与奇异值本身相对应:

from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import TruncatedSVD

sc = StandardScaler()
Xs = sc.fit_transform(X) # X data from the question here

svd = TruncatedSVD(n_components=4)
svd.fit(Xs)

print(svd.explained_variance_ratio_)
print(svd.singular_values_)

结果:

[4.60479851e-01 3.77856541e-01 1.61663608e-01 8.13905807e-66]
[5.07807756e+00 4.59999633e+00 3.00884730e+00 8.21430014e-17]

有关 PCA 和 SVD 计算中居中数据和非居中数据之间的数学和计算差异,请参阅居中对 PCA 有何影响(对于 SVD 和特征分解)?


关于其TruncatedSVD自身的使用,这里再次是用户 ogrisel(scikit-learn 贡献者)在PCA 和 TruncatedSVD 的 scikit-learn 实现之间的差异的相关答案中:

在实践TruncatedSVD中,对于无法居中而不会使内存使用爆炸的大型稀疏数据集很有用。

因此,尚不清楚您为什么选择在TruncatedSVD这里使用,但是,如果您没有导致内存问题的过大数据集,我想您应该改用 PCA。


推荐阅读