python - 为什么 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]
我听说奇异值意味着该组件可以解释多少数据,所以我认为解释的方差比也遵循奇异值的顺序。但比率不是按降序排列的。
有人可以解释为什么会这样吗?
解决方案
听说奇异值表示组件能解释多少数据
这适用于 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。
推荐阅读
- python - 使用 pywinauto 确认 PuTTY 主机密钥提示
- excel - Excel VBA - 大数的奇怪问题
- testing - 测试中未保存的 Grails 域类
- javascript - 用 js 地图检查的复选框
- powershell - PowerShell 类中的重载运算符 %
- python - Pymodbus 使用串行客户端注册自定义格式
- javascript - 有没有办法通过单击按钮来捕捉 onchange 触发器?
- tfs - 拉取请求状态 - 向状态添加的自定义属性不会被 TFS 持久化
- laravel - 漂亮的网址不适用于 XAMPP 和 Laravel 5.8
- python - 在 colab TPU 上运行 keras 模型