【问题标题】:Why scikit-learn truncatedSVD uses 'randomized' algorithm as default?为什么 scikit-learn truncatedSVD 默认使用“随机”算法?
【发布时间】:2016-08-17 03:57:46
【问题描述】:
我使用 truncatedSVD 和 30000 x 40000 大小的术语文档矩阵来将维度减少到 3000 维度,
使用“随机化”时,方差比约为 0.5 (n_iter=10)
使用 'arpack' 时,方差比约为 0.9
“随机”算法的方差比低于“arpack”之一。
那么为什么 scikit-learn truncatedSVD 默认使用“随机”算法?
【问题讨论】:
标签:
scikit-learn
svd
dimension-reduction
【解决方案1】:
速度!
根据docs,sklearn.decomposition.TruncatedSVD可以使用随机算法,因为Halko, Martinson, and Tropp (2009).这篇论文声称他们的算法要快得多。
对于稠密矩阵,它需要 O(m*n*log(k)) 时间,而经典算法需要 O(m*n*k) 时间,其中 m 和 n 是矩阵的维数您想要第 k 个最大的组件。随机算法也更容易有效地并行化并减少对数据的传递。
论文的表 7.1(第 45 页)显示了一些算法的性能与矩阵大小和组件数的关系,随机算法通常快一个数量级。
输出的准确性也声称非常好(图 7.5),尽管有一些修改和常量可能会影响它,而且我还没有查看 sklearn 代码来查看它们做了什么/没做什么.