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', rng=None, options=None)

使用 ARPACK 对稀疏矩阵进行部分奇异值分解。

计算稀疏矩阵 A 的最大或最小 k 个奇异值和相应的奇异向量。 不保证返回奇异值的顺序。

在以下描述中,设 M, N = A.shape

参数:
A稀疏矩阵或 LinearOperator

要分解的矩阵。

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’}, 可选

这是 solver='arpack' 的特定于求解器的文档。还支持 'lobpcg''propack'

rngnumpy.random.Generator, 可选

伪随机数生成器状态。当 rng 为 None 时,会使用来自操作系统的熵创建一个新的 numpy.random.Generator。 将 numpy.random.Generator 之外的类型传递给 numpy.random.default_rng 以实例化 Generator

optionsdict,可选

特定于求解器选项的字典。当前不支持任何特定于求解器的选项;此参数保留供将来使用。

返回:
undarray,形状=(M, k)

以左奇异向量为列的酉矩阵。

sndarray,形状=(k,)

奇异值。

vhndarray,形状=(k, N)

以右奇异向量为行的酉矩阵。

说明

这是使用 ARPACK 作为 A.conj().T @ AA @ A.conj().T 的特征值求解器的简单实现,具体取决于哪个更有效。

示例

从奇异值和向量构造矩阵 A

>>> import numpy as np
>>> from scipy.stats import ortho_group
>>> from scipy.sparse import csc_array, diags_array
>>> from scipy.sparse.linalg import svds
>>> rng = np.random.default_rng()
>>> orthogonal = csc_array(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_array(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