python - 为什么 Sklearn TruncatedSVD 的解释方差比不是按降序排列?

标签 python scikit-learn svd

为什么 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]

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

为什么会发生这种情况?

最佳答案

I heard that a singular value means how much the component can explain data

这适用于 PCA,但对于(截断的)SVD 来说并不完全正确;引用相关Github thread回到那时,explained_variance_ratio_ 属性甚至无法用于 TruncatedSVD(2014 年 - 重点是我的):

preserving the variance is not the exact objective function of truncated SVD without centering

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

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

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 计算中中心数据和非中心数据之间的数学和计算差异,请参阅 How does centering make a difference in PCA (for SVD and eigen decomposition)?


关于 TruncatedSVD 本身的使用,这里是用户 ogrisel(scikit-learn 贡献者)在 Difference between scikit-learn implementations of PCA and TruncatedSVD 中的相关答案。 :

In practice TruncatedSVD is useful on large sparse datasets which cannot be centered without making the memory usage explode.

因此,目前尚不清楚您为何选择在此处使用 TruncatedSVD,但是,如果您没有导致内存问题的太大数据集,我想您应该恢复到 PCA相反。

关于python - 为什么 Sklearn TruncatedSVD 的解释方差比不是按降序排列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61744485/

相关文章:

python - 为什么不替换新数据框中的列?

python - pyautogui 自动下移/上移和 ctrl-c 不起作用

python scikit 通过核心学习来学习超参数调整

python - 线性模型的系数太大/太低

eigen - 使用特征值计算零空间是错误的?

python - 如何在长时间运行的程序中立即确认 Pub/Sub 消息

python - scikit 学习 : Problems creating customized CountVectorizer and ChiSquare

python - KerasRegressor 决定系数 R^2 分数

machine-learning - PCA、TruncatedSVD 和 ICA 之间的详细区别是什么?

python - 为什么我的 A*A Transpose 和 A Transpose*A 的特征值不匹配?