SVDS(solver=‘lobpcg’)¶
- 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={})
利用LOBPCG实现稀疏矩阵的部分奇异值分解。
计算最大或最小 k 稀疏矩阵的奇异值及其对应的奇异向量 A 。不保证返回奇异值的顺序。
在下面的描述中,让我们
M, N = A.shape
。- 参数
- A稀疏矩阵或线性运算符
要分解的矩阵。
- k整型,默认值:6
要计算的奇异值和奇异向量的数量。必须满足
1 <= k <= min(M, N) - 1
。- ncv整型,可选
已忽略。
- tol浮动,可选
单值公差。零(默认值)表示机器精度。
- which{‘LM’,‘SM’}
哪一个 k 要查找的奇异值:最大震级(‘LM’)或最小震级(‘SM’)奇异值。
- v0ndarray,可选
如果 k 为1,迭代的起始向量:(近似)左奇异向量,如果
N > M
反之则是右奇异向量。必须是长度的min(M, N)
。否则被忽略。默认值:随机- maxiter整型,默认值:20
最大迭代次数。
- return_singular_vectors{True,False,“u”,“vh”}
始终计算并返回奇异值;此参数控制奇异值的计算和返回。
True
:返回奇异向量。False
:不返回单数向量。"u"
:如果M <= N
,只计算左奇异向量并返回None
对于右奇异向量。否则,计算所有奇异向量。"vh"
:如果M > N
,只计算右奇异向量并返回None
对于左奇异向量。否则,计算所有奇异向量。
- solver{‘arpack’,‘propack’,‘lobpcg’},可选
- random_state :{无,整型,
numpy.random.Generator
,{无,整型, 用于生成重采样的伪随机数生成器状态。
如果 random_state 是
None
(或 np.random )、numpy.random.RandomState
使用的是Singleton。如果 random_state 是一个整型、一个新的RandomState
实例,其种子设定为 random_state 。如果 random_state 已经是一个Generator
或RandomState
实例,则使用该实例。- optionsDICT,可选
求解器特定选项的字典。当前不支持特定于求解器的选项;此参数保留供将来使用。
- 退货
- undarray,形状=(M,k)
以左奇异向量为列的酉矩阵。
- sndarray,形状=(k,)
奇异值。
- vhndarray,形状=(k,N)
右奇异向量为行的酉矩阵。
注意事项
这是一种使用LOBPCG作为上的特征解析器的天真实现
A.conj().T @ A
或A @ A.conj().T
,取决于哪一个更有效率。示例
构造一个矩阵
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='lobpcg') >>> A2 = u2 @ np.diag(s2) @ vT2 >>> np.allclose(A2, A.toarray(), atol=1e-3) True
有了所有五个奇异值/向量,我们就可以重现原始矩阵。
>>> u3, s3, vT3 = svds(A, k=5, solver='lobpcg') >>> 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.todense())) and ... np.allclose(np.abs(vT3), np.abs(vT.todense()))) True
奇异向量也是正交的。>(np.allclose(u3.T@u3,np.ye(5)和.np.allclose(vt3@vT3.T,np.ye(5)True