svds(solver=’arpack’)#
- scipy.sparse.linalg.svds(A, k=6, ncv=None, tol=0, which='LM', v0=None, maxiter=None, return_singular_vectors=True, solver='arpack', random_state=None, options=None)
使用 ARPACK 对稀疏矩阵进行部分奇异值分解。
计算稀疏矩阵 A 的最大或最小 k 个奇异值及其对应的奇异向量。奇异值的返回顺序无法保证。
在以下描述中,设
M, N = A.shape
。- 参数:
- A稀疏矩阵或线性算子
要分解的矩阵。
- kint,可选
要计算的奇异值和奇异向量的数量。必须满足
1 <= k <= min(M, N) - 1
。默认值为 6。- ncvint,可选
生成的 Lanczos 向量数量。默认值为
min(n, max(2*k + 1, 20))
。如果指定,则必须满足k + 1 < ncv < min(M, N)
;建议使用ncv > 2*k
。- tolfloat,可选
奇异值的容差。零(默认值)表示机器精度。
- which{‘LM’, ‘SM’}
要查找的 k 个奇异值:最大幅度 (‘LM’) 或最小幅度 (‘SM’) 奇异值。
- v0ndarray,可选
迭代的起始向量:如果
N > M
,则为一个(近似的)左奇异向量;否则为一个右奇异向量。必须长度为min(M, N)
。默认值:随机- maxiterint,可选
允许的最大 Arnoldi 更新迭代次数;默认值为
min(M, N) * 10
。- return_singular_vectors{True, False, “u”, “vh”}
奇异值始终计算并返回;此参数控制奇异向量的计算和返回。
True
: 返回奇异向量。False
: 不返回奇异向量。"u"
: 如果M <= N
,则仅计算左奇异向量,并将右奇异向量返回为None
。否则,计算所有奇异向量。"vh"
: 如果M > N
,则仅计算右奇异向量,并将左奇异向量返回为None
。否则,计算所有奇异向量。
- solver{‘arpack’, ‘propack’, ‘lobpcg’},可选
- random_state{None, int,
numpy.random.Generator
, numpy.random.RandomState
}, optional用于生成重采样的伪随机数生成器状态。
如果 random_state 为
None
(或 np.random),则使用numpy.random.RandomState
单例。如果 random_state 为一个整数,则使用一个新的RandomState
实例,并使用 random_state 对其进行播种。如果 random_state 已经是一个Generator
或RandomState
实例,则使用该实例。- optionsdict,可选
一个包含特定于求解器的选项的字典。目前不支持任何特定于求解器的选项;此参数为将来使用保留。
- 返回值:
- undarray,shape=(M, k)
具有左奇异向量作为列的酉矩阵。
- sndarray,shape=(k,)
奇异值。
- vhndarray,shape=(k, N)
具有右奇异向量作为行的酉矩阵。
备注
这是一个使用 ARPACK 作为
A.conj().T @ A
或A @ A.conj().T
上的特征值求解器的朴素实现,具体取决于哪个更高效。示例
从奇异值和奇异向量构建一个矩阵
A
。>>> import numpy as np >>> from scipy.stats import ortho_group >>> from scipy.sparse import csc_matrix, diags >>> from scipy.sparse.linalg import svds >>> rng = np.random.default_rng() >>> orthogonal = csc_matrix(ortho_group.rvs(10, random_state=rng)) >>> s = [0.0001, 0.001, 3, 4, 5] # singular values >>> u = orthogonal[:, :5] # left singular vectors >>> vT = orthogonal[:, 5:].T # right singular vectors >>> A = u @ diags(s) @ vT
仅使用三个奇异值/向量,SVD 近似原始矩阵。
>>> u2, s2, vT2 = svds(A, k=3, solver='arpack') >>> A2 = u2 @ np.diag(s2) @ vT2 >>> np.allclose(A2, A.toarray(), atol=1e-3) True
使用所有五个奇异值/向量,我们可以重现原始矩阵。
>>> u3, s3, vT3 = svds(A, k=5, solver='arpack') >>> A3 = u3 @ np.diag(s3) @ vT3 >>> np.allclose(A3, A.toarray()) True
奇异值与预期的奇异值匹配,奇异向量与预期的奇异向量一致,最多相差符号。
>>> (np.allclose(s3, s) and ... np.allclose(np.abs(u3), np.abs(u.toarray())) and ... np.allclose(np.abs(vT3), np.abs(vT.toarray()))) True
奇异向量也正交。
>>> (np.allclose(u3.T @ u3, np.eye(5)) and ... np.allclose(vT3 @ vT3.T, np.eye(5))) True