为什么Sklearn TruncatedSVD的解释方差比不是降序的?

问题描述 投票:1回答:1

爲什麽 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]

我听说奇异值代表了成分对数据的解释能力 所以我认为解释方差比也是按照奇异值的顺序排列的 但是比值并不是按照降序排列的,谁能解释一下为什么会这样?

谁能解释一下为什么会这样?

python scikit-learn svd
1个回答
2
投票

听说,单值意味着该分量能解释多少数据

这对于PCA来说是成立的,但对于(截断的)SVD来说并不完全正确;引用相关的 Github线程 当年 explained_variance_ratio_ 属性甚至无法用于 TruncatedSVD 2014年--重点是我)。

保留方差不是截断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的贡献者)在相关回答中的回答 scikit-learn实现PCA和TruncatedSVD之间的差异。:

实践中 TruncatedSVD 在大型稀疏数据集上是很有用的,因为这些数据集无法在不使内存使用量爆炸的情况下居中。

所以,我不太清楚为什么你选择使用 TruncatedSVD 在这里,但是,如果你没有一个太大的数据集,导致内存问题,我想你应该恢复到PCA代替。

© www.soinside.com 2019 - 2024. All rights reserved.