为什么 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 不做。
我使用了 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 不做。