![](/img/trans.png)
[英]Python py2exe executable silent crash with scipy.linalg or numpy.linalg
[英]Python eigenvectors: differences among numpy.linalg, scipy.linalg and scipy.sparse.linalg
Scipy和Numpy在它們之間有三個不同的函數來尋找給定方陣的特征向量,它們是:
特別關注我最后兩個留下的所有可選參數都保留默認值並且a
/ A
是實值的情況,我很好奇這三個文檔之間的差異,這些差異在文檔中是模棱兩可的 - 尤其是:
k
參數? 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.