为什么 scikit-learn truncatedSVD 默认使用 'randomized' 算法?

Why scikit-learn truncatedSVD uses 'randomized' algorithm as default?

我使用了 30000 x 40000 大小的术语文档矩阵的 truncatedSVD 将维数减少到 3000 维, 使用 'randomized' 时,方差比约为 0.5 (n_iter=10) 使用'arpack'时,方差比约为0.9

'randomized' 算法的方差比低于 'arpack'。

那么为什么 scikit-learn truncatedSVD 默认使用 'randomized' 算法?

速度!

根据 docs, sklearn.decomposition.TruncatedSVD can use a randomized algorithm due to Halko, Martinson, and Tropp (2009). 本文声称他们的算法要快得多。

对于密集矩阵,它运行时间为O(m*n*log(k)),而经典算法需要O(m*n*k)时间,其中m和n是矩阵的维度您想要第 k 个最大组件的矩阵。随机算法也更容易有效地并行化并且减少对数据的传递。

Table 论文的 7.1(第 45 页)显示了一些算法的性能作为矩阵大小和组件数量的函数,并且随机算法通常快一个数量级。

据称输出的准确性也相当不错(图 7.5),尽管有一些修改和常量可能会影响它,我还没有通过 sklearn 代码看它们是什么 did/did 不做。