随机奇异值分解#

sklearn.utils.extmath.randomized_svd(M, n_components, *, n_oversamples=10, n_iter='auto', power_iteration_normalizer='auto', transpose='auto', flip_sign=True, random_state=None, svd_lapack_driver='gesdd')[source]#

计算截断随机奇异值分解。

此方法解决了 [1](问题 (1.5),第 5 页)中描述的固定秩逼近问题。

关于幂迭代算法在网页排名中的典型示例,请参考维基百科主特征向量。此算法也被用作Google PageRank算法的构建块。

参数:
M{ndarray, sparse matrix}

待分解的矩阵。

n_componentsint

要提取的奇异值和向量的数量。

n_oversamplesint, default=10

额外采样的随机向量数量,用于采样M的范围,以确保适当的条件数。用于查找M范围的随机向量总数为n_components + n_oversamples。较小的数字可以提高速度,但会对奇异向量和奇异值的逼近质量产生负面影响。对于大型矩阵、噪声问题、频谱衰减缓慢的矩阵或需要提高精度的情况,用户可能希望将此参数增加到2*k - n_components(其中k为有效秩)。参见[1](第5、23和26页)。

n_iterint 或 ‘auto’, default=’auto’

幂迭代次数。它可以用于处理非常嘈杂的问题。当设置为'auto'时,它被设置为4,除非n_components很小(< .1 * min(X.shape)),在这种情况下n_iter被设置为7。这提高了少量成分的精度。请注意,通常用户应该先增加n_oversamples,然后再增加n_iter,因为随机方法的原理是避免使用这些代价更高的幂迭代步骤。当n_components等于或大于有效矩阵秩且频谱没有缓慢衰减时,理论上n_iter=01甚至可以正常工作(参见[1]第9页)。

0.18版本中的变更。

power_iteration_normalizer{‘auto’, ‘QR’, ‘LU’, ‘none’}, default=’auto’

幂迭代是否通过逐步QR分解进行归一化(最慢但最准确)、'none'(最快,但在n_iter较大时,例如通常为5或更大时,数值不稳定)或'LU'分解(数值稳定,但在精度方面可能略有损失)。'auto'模式在n_iter <= 2时不进行归一化,否则切换到LU。

0.18版本中添加。

transposebool 或 ‘auto’, default=’auto’

算法是否应该应用于M.T而不是M。结果应该大致相同。如果M.shape[1] > M.shape[0],则'auto'模式将触发转置,因为这种随机SVD的实现在这种情况下往往会更快。

0.18版本中的变更。

flip_signbool, default=True

奇异值分解的结果只取决于奇异向量的符号排列。如果flip_sign设置为True,则通过使左奇异向量中每个分量的最大载荷为正来解决符号模糊性。

random_stateint, RandomState 实例 或 None, default=’warn’

在混洗数据时使用的伪随机数生成器的种子,即获取用于初始化算法的随机向量。传递一个整数以在多次函数调用中获得可重复的结果。参见词汇表

1.2版本中的变更:默认值从0更改为None。

svd_lapack_driver{“gesdd”, “gesvd”}, default=”gesdd”

是否使用更高效的分治法("gesdd")或更通用的矩形法("gesvd")来计算矩阵B的SVD,B是M投影到低维子空间的结果,如[1]中所述。

1.2版本中添加。

返回:
undarray of shape (n_samples, n_components)

具有左奇异向量(符号已反转)作为列的酉矩阵。

sndarray of shape (n_components,)

奇异值,按非递减顺序排序。

vhndarray of shape (n_components, n_features)

具有右奇异向量(符号已反转)作为行的酉矩阵。

备注

此算法使用随机化来加速计算,从而找到一个(通常非常好的)近似截断奇异值分解。它在希望仅提取少量成分的大型矩阵上特别快。为了获得更快的速度,可以将n_iter设置为<=2(代价是精度损失)。为了提高精度,建议增加n_oversamples,最多增加到2*k-n_components,其中k是有效秩。通常,n_components的选择大于k,因此将n_oversamples增加到n_components就足够了。

参考文献

[2]

矩阵分解的随机算法 Per-Gunnar Martinsson、Vladimir Rokhlin 和 Mark Tygert

[3]

主成分分析的随机算法实现 A. Szlam等人 2014

示例

>>> import numpy as np
>>> from sklearn.utils.extmath import randomized_svd
>>> a = np.array([[1, 2, 3, 5],
...               [3, 4, 5, 6],
...               [7, 8, 9, 10]])
>>> U, s, Vh = randomized_svd(a, n_components=2, random_state=0)
>>> U.shape, s.shape, Vh.shape
((3, 2), (2,), (2, 4))