randomized_svd#

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]#

计算截断的随机SVD。

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

有关使用幂迭代算法对网页进行排名的典型示例,请参阅Wikipedia主特征向量。该算法也作为Google PageRank算法中的构建块而闻名。

参数:
M{array-like, 稀疏矩阵},形状为 (n_samples, n_features)

要分解的矩阵。

n_components整型

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

n_oversamples整型, 默认值=10

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

n_iter整型 或 ‘auto’,默认值=’auto’

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

版本0.18中已更改。

power_iteration_normalizer{‘auto’, ‘QR’, ‘LU’, ‘none’}, 默认值=’auto’

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

版本0.18中新增。

transpose布尔型 或 ‘auto’, 默认值=’auto’

算法是否应用于 M.T 而不是 M。结果应该大致相同。“auto”模式在 M.shape[1] > M.shape[0] 时会触发转置,因为在这种情况下,随机SVD的此实现往往会稍微快一些。

版本0.18中已更改。

flip_sign布尔型, 默认值=True

奇异值分解的输出仅在奇异向量的符号置换下是唯一的。如果flip_sign设置为True,则通过使左奇异向量中每个分量的最大载荷为正来解决符号歧义。

random_state整型, RandomState 实例 或 None, 默认值=’warn’

用于在打乱数据时(即获取随机向量以初始化算法时)使用的伪随机数生成器的种子。传入一个整型以在多次函数调用中获得可复现的结果。参见术语表

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

svd_lapack_driver{“gesdd”, “gesvd”}, 默认值=”gesdd”

是使用更高效的分而治之方法("gesdd")还是更通用的矩形方法("gesvd")来计算矩阵 B 的 SVD,其中 B 是 M 在低维子空间中的投影,如[1]中所述。

版本1.2中新增。

返回:
undarray,形状为 (n_samples, n_components)

具有翻转符号的左奇异向量作为列的酉矩阵。

sndarray,形状为 (n_components,)

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

vhndarray,形状为 (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 and Mark Tygert

[3]

主成分分析随机算法的实现 A. Szlam et al. 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))