随机奇异值分解#
- 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=0
或1
甚至可以正常工作(参见[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))