簡體   English   中英

Python特征向量:numpy.linalg,scipy.linalg和scipy.sparse.linalg之間的差異

[英]Python eigenvectors: differences among numpy.linalg, scipy.linalg and scipy.sparse.linalg

Scipy和Numpy在它們之間有三個不同的函數來尋找給定方陣的特征向量,它們是:

  1. numpy.linalg.eig(a)
  2. scipy.linalg.eig(a) ,和
  3. scipy.sparse.linalg.eig(A, k)

特別關注我最后兩個留下的所有可選參數都保留默認值並且a / A是實值的情況,我很好奇這三個文檔之間的差異,這些差異在文檔中是模棱兩可的 - 尤其是:

  • 為什么(3)有一個注釋,它找不到所有的特征向量?
  • 為什么其他兩個必須計算所有解決方案 - 他們為什么不采取k參數?
  • (1)有一個注釋說明特征值沒有特定的順序返回; (3)有一個可選參數來控制訂單。 (2)是否對此作出任何保證?
  • (3)是否假設A稀疏? (從數學上講,而不是表示為scipy稀疏矩陣)如果這個假設不成立,它可能是效率低下,甚至是錯誤的結果嗎?
  • 在選擇這些時,我還應該考慮其他因素嗎?

第三個特殊行為與Lanczos算法有關Lanczos算法適用於稀疏矩陣。 scipy.sparse.linalg.eig的文檔說它使用ARPACK的包裝器,后者又使用“隱式重啟的Arnoldi方法(IRAM),或者在對稱矩陣的情況下,使用Lanczos算法的相應變體。” (1)

現在,Lanczos算法具有對大特征值更有效的特性(事實上,它使用最大特征值):

在實踐中,這種簡單的算法對於計算很多特征向量不能很好地工作,因為任何舍入誤差都會將更重要的特征向量的微小分量引入計算中,從而降低計算的准確性。 (2)

因此,雖然Lanczos算法只是一種近似,我猜其他兩種方法使用算法來找到確切的特征值 - 看起來所有這些都可能取決於所使用的算法。

以下是您問題的非常規特定部分的答案:

原則上,NumPy和SciPy linalg()例程應該是相同的。 兩者都在內部使用LAPACK和BLAS例程。 `'scipy.sparse``中的實現使用了一種適用於稀疏矩陣的特定算法(即,大多數為零條目的矩陣)。 如果基質密集,請不要使用此選項。

請注意,從技術上講,SciPy / NumPy中的eig()是不同的實現,因為兩個包都可以使用不同的Lapack / BLAS實現構建。 這里的常見選擇是標准的Lapack / BLAS,可從netlib, ATLAS ,Intel MKL或OpenBLAS獲得

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM