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=0
或1
也应该能正常工作(参见[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))