SVDS(求解器=‘Propack’)

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={})

用PROPACK实现稀疏矩阵的部分奇异值分解。

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

在下面的描述中,让我们 M, N = A.shape

参数
A稀疏矩阵或线性运算符

要分解的矩阵。如果 A 是一种 LinearOperator 对象,则它必须同时定义 matvecrmatvec 方法。

k整型,默认值:6

要计算的奇异值和奇异向量的数量。必须满足 1 <= k <= min(M, N)

ncv整型,可选

已忽略。

tol浮动,可选

计算的奇异值所需的相对精度。零(默认值)表示机器精度。

which{‘LM’,‘SM’}

哪一个 k 要查找的奇异值:最大震级(‘LM’)或最小震级(‘SM’)奇异值。请注意,选择 which='SM' 将迫使 irl 要设置的选项 True

v0ndarray,可选

迭代的起始向量:长度必须为 A.shape[0] 。如果未指定,PROPACK将生成起始向量。

maxiter整型,可选

Krylov子空间的最大迭代次数/最大维数。默认值为 10 * k

return_singular_vectors{True,False,“u”,“vh”}

始终计算并返回奇异值;此参数控制奇异值的计算和返回。

  • True :返回奇异向量。

  • False :不返回单数向量。

  • "u" :仅计算左奇异向量;返回 None 对于右奇异向量。

  • "vh" :仅计算右奇异向量;返回 None 对于左奇异向量。

solver{‘arpack’,‘propack’,‘lobpcg’},可选

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

random_state :{无,整型, numpy.random.Generator{无,整型,

用于生成重采样的伪随机数生成器状态。

如果 random_stateNone (或 np.random )、 numpy.random.RandomState 使用的是Singleton。如果 random_state 是一个整型、一个新的 RandomState 实例,其种子设定为 random_state 。如果 random_state 已经是一个 GeneratorRandomState 实例,则使用该实例。

optionsDICT,可选

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

退货
undarray,形状=(M,k)

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

sndarray,形状=(k,)

奇异值。

vhndarray,形状=(k,N)

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

注意事项

这是Fortran库Propack的接口 [1]. 当前默认设置是在禁用IRL模式的情况下运行,除非寻求最小的奇异值/向量 (which='SM' )。

参考文献

1

拉森,这是拉斯穆斯·蒙克。“Propack-用于大型稀疏SVD计算的软件。”在线提供。url http://sun.斯坦福大学。EDU/Rmunk/Propack(2004年):2008-2009年。

示例

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

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

在只有三个奇异值/向量的情况下,奇异值分解近似于原始矩阵。

>>> u2, s2, vT2 = svds(A, k=3, solver='propack')
>>> A2 = u2 @ np.diag(s2) @ vT2
>>> np.allclose(A2, A.todense(), atol=1e-3)
True

有了所有五个奇异值/向量,我们就可以重现原始矩阵。

>>> u3, s3, vT3 = svds(A, k=5, solver='propack')
>>> A3 = u3 @ np.diag(s3) @ vT3
>>> np.allclose(A3, A.todense())
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.ye(5)和.np.allclose(vt3@vT3.T,np.ye(5)True