scipy.sparse.linalg.

eigsh#

scipy.sparse.linalg.eigsh(A, k=6, M=None, sigma=None, which='LM', v0=None, ncv=None, maxiter=None, tol=0, return_eigenvectors=True, Minv=None, OPinv=None, mode='normal')[原始碼]#

尋找實對稱方陣或複 Hermitian 矩陣 A 的 k 個特徵值和特徵向量。

A @ x[i] = w[i] * x[i],w[i] 特徵值的標準特徵值問題,以及對應的特徵向量 x[i]。

如果指定 M,則解 A @ x[i] = w[i] * M @ x[i],w[i] 特徵值的廣義特徵值問題,以及對應的特徵向量 x[i]。

請注意,對於 A 是複 Hermitian 矩陣的情況,沒有專門的常式。在這種情況下,eigsh() 將呼叫 eigs() 並傳回由此獲得的特徵值的實部。

參數:
Andarray、稀疏矩陣或 LinearOperator

表示運算 A @ x 的方陣運算元,其中 A 是實對稱或複 Hermitian。對於挫曲模式(見下文),A 必須另外是正定矩陣。

kint,選用

所需的特徵值和特徵向量的數量。k 必須小於 N。無法計算矩陣的所有特徵向量。

傳回值:
warray

k 個特徵值的陣列。

varray

表示 k 個特徵向量的陣列。欄位 v[:, i] 是對應於特徵值 w[i] 的特徵向量。

其他參數:
MN x N 矩陣、陣列、稀疏矩陣或線性運算元,表示

廣義特徵值問題的運算 M @ x

A @ x = w * M @ x。

如果 A 是實數,則 M 必須表示實對稱矩陣;如果 A 是複數,則 M 必須表示複 Hermitian 矩陣。為了獲得最佳結果,M 的資料類型應與 A 的資料類型相同。此外

如果 sigma 為 None,則 M 是對稱正定矩陣。

如果指定 sigma,則 M 是對稱正半定矩陣。

在挫曲模式下,M 是對稱不定矩陣。

如果 sigma 為 None,則 eigsh 需要一個運算元來計算線性方程式 M @ x = b 的解。這在內部透過顯式矩陣 M 的(稀疏)LU 分解,或透過一般線性運算元的迭代求解器來完成。或者,使用者可以提供矩陣或運算元 Minv,它給出 x = Minv @ b = M^-1 @ b

sigma實數

使用位移反轉模式尋找 sigma 附近的特徵值。這需要一個運算元來計算線性系統 [A - sigma * M] x = b 的解,其中如果未指定,則 M 是單位矩陣。這在內部透過顯式矩陣 A 和 M 的(稀疏)LU 分解來計算,或者如果 A 或 M 是通用線性運算元,則透過迭代求解器來計算。或者,使用者可以提供矩陣或運算元 OPinv,它給出 x = OPinv @ b = [A - sigma * M]^-1 @ b。請注意,當指定 sigma 時,關鍵字 'which' 是指位移的特徵值 w'[i],其中

如果 mode == 'normal',w'[i] = 1 / (w[i] - sigma)

如果 mode == 'cayley',w'[i] = (w[i] + sigma) / (w[i] - sigma)

如果 mode == 'buckling',w'[i] = w[i] / (w[i] - sigma)

(請參閱下面「mode」中的進一步討論)

v0ndarray,選用

迭代的起始向量。預設值:隨機

ncvint,選用

產生的 Lanczos 向量的數量 ncv 必須大於 k 且小於 n;建議 ncv > 2*k。預設值:min(n, max(2*k + 1, 20))

whichstr ['LM' | 'SM' | 'LA' | 'SA' | 'BE']

如果 A 是複 Hermitian 矩陣,則 'BE' 無效。要尋找的 k 個特徵向量和特徵值

'LM' : 最大(依量值)特徵值。

'SM' : 最小(依量值)特徵值。

'LA' : 最大(代數)特徵值。

'SA' : 最小(代數)特徵值。

'BE' : 從頻譜的每一端取一半 (k/2)。

當 k 為奇數時,從高端傳回多一個 (k/2+1)。當 sigma != None 時,'which' 是指位移的特徵值 w'[i](請參閱上面「sigma」中的討論)。ARPACK 通常更擅長尋找大值而不是小值。如果需要小特徵值,請考慮使用位移反轉模式以獲得更好的效能。

maxiterint,選用

允許的最大 Arnoldi 更新迭代次數。預設值:n*10

tolfloat

特徵值的相對準確度(停止條件)。預設值 0 表示機器精度。

MinvN x N 矩陣、陣列、稀疏矩陣或 LinearOperator

請參閱上面 M 中的註解。

OPinvN x N 矩陣、陣列、稀疏矩陣或 LinearOperator

請參閱上面 sigma 中的註解。

return_eigenvectorsbool

除了特徵值之外,還傳回特徵向量 (True)。此值決定特徵值的排序順序。排序順序也取決於 which 變數。

對於 which = 'LM' 或 'SA'

如果 return_eigenvectors 為 True,則特徵值依代數值排序。

如果 return_eigenvectors 為 False,則特徵值依絕對值排序。

對於 which = 'BE' 或 'LA'

特徵值始終依代數值排序。

對於 which = 'SM'

如果 return_eigenvectors 為 True,則特徵值依代數值排序。

如果 return_eigenvectors 為 False,則特徵值依遞減的絕對值排序。

modestring ['normal' | 'buckling' | 'cayley']

指定用於位移反轉模式的策略。此引數僅適用於實數值 A 和 sigma != None。對於位移反轉模式,ARPACK 內部解特徵值問題 OP @ x'[i] = w'[i] * B @ x'[i],並將產生的 Ritz 向量 x'[i] 和 Ritz 值 w'[i] 轉換為問題 A @ x[i] = w[i] * M @ x[i] 的所需特徵向量和特徵值。模式如下

'normal'

OP = [A - sigma * M]^-1 @ M, B = M, w'[i] = 1 / (w[i] - sigma)

'buckling'

OP = [A - sigma * M]^-1 @ A, B = A, w'[i] = w[i] / (w[i] - sigma)

'cayley'

OP = [A - sigma * M]^-1 @ [A + sigma * M], B = M, w'[i] = (w[i] + sigma) / (w[i] - sigma)

模式的選擇會影響關鍵字 'which' 選擇哪些特徵值,也可能影響收斂的穩定性(請參閱 [2] 中的討論)。

引發:
ArpackNoConvergence

當未獲得請求的收斂時。

目前收斂的特徵值和特徵向量可以作為例外物件的 eigenvalueseigenvectors 屬性找到。

參見

eigs

一般(非對稱)矩陣 A 的特徵值和特徵向量

svds

矩陣 A 的奇異值分解

註解

此函數是 ARPACK [1] SSEUPD 和 DSEUPD 函數的包裝函式,這些函數使用隱式重新啟動 Lanczos 方法來尋找特徵值和特徵向量 [2]

參考文獻

[1]

ARPACK 軟體,opencollab/arpack-ng

[2]

R. B. Lehoucq、D. C. Sorensen 和 C. Yang,《ARPACK USERS GUIDE: Solution of Large Scale Eigenvalue Problems by Implicitly Restarted Arnoldi Methods》。SIAM,費城,賓夕法尼亞州,1998 年。

範例

>>> import numpy as np
>>> from scipy.sparse.linalg import eigsh
>>> identity = np.eye(13)
>>> eigenvalues, eigenvectors = eigsh(identity, k=6)
>>> eigenvalues
array([1., 1., 1., 1., 1., 1.])
>>> eigenvectors.shape
(13, 6)