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', rng=None, options=None)
使用 PROPACK 對稀疏矩陣進行部分奇異值分解。
計算稀疏矩陣 A 的最大或最小 k 個奇異值和對應的奇異向量。不保證返回奇異值的順序。
在以下描述中,令
M, N = A.shape
。- 參數:
- A稀疏矩陣或 LinearOperator
要分解的矩陣。如果 A 是
LinearOperator
物件,則必須定義matvec
和rmatvec
方法。- 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’},選填
- rng
numpy.random.Generator
,選填 偽隨機數產生器狀態。當 rng 為 None 時,將使用作業系統的熵建立一個新的
numpy.random.Generator
。numpy.random.Generator
以外的類型會傳遞給numpy.random.default_rng
以實例化一個Generator
。- optionsdict,選填
求解器特定選項的字典。目前不支援任何求解器特定選項;此參數保留供未來使用。
- 返回:
- undarray,形狀=(M, k)
具有左奇異向量作為列的么正矩陣。
- sndarray,形狀=(k,)
奇異值。
- vhndarray,形狀=(k, N)
具有右奇異向量作為列的么正矩陣。
註解
這是 Fortran 程式庫 PROPACK [1] 的介面。目前的預設值是在禁用 IRL 模式下運行,除非尋找最小的奇異值/向量 (
which='SM'
)。參考文獻
[1]Larsen, Rasmus Munk. “PROPACK-Software for large and sparse SVD calculations.” 線上提供。網址 http://sun.stanford.edu/~rmunk/PROPACK (2004): 2008-2009。
範例
從奇異值和奇異向量建構矩陣
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='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.eye(5)) and ... np.allclose(vT3 @ vT3.T, np.eye(5))) True