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