爲什麽 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]
我听说奇异值代表了成分对数据的解释能力 所以我认为解释方差比也是按照奇异值的顺序排列的 但是比值并不是按照降序排列的,谁能解释一下为什么会这样?
谁能解释一下为什么会这样?
听说,单值意味着分量能解释多少数据。
这对于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代替。