![](/img/trans.png)
[英]Different eigenvalues between scipy.sparse.linalg.eigs and numpy/scipy.eig
[英]python scipy.sparse.linalg.eigs giving different results for consecutive calls
我試圖計算python中稀疏矩陣的譜半徑 。 這就是我所擁有的:
from scipy.sparse.linalg import eigs
from scipy import sparse
w = sparse.rand(10, 10, 0.1)
spec_radius = max(abs(eigs(w)[0]))
其中w
的值被縮放到[-1,1]
的范圍內。 但是,運行該命令每次都會產生不同的結果:
>>> print max(abs(eigs(w)[0]))
4.51859016293e-05
>>> print max(abs(eigs(w)[0]))
4.02309443625e-06
>>> print max(abs(eigs(w)[0]))
3.7611221426e-05
是什么賦予了? 我原以為每次都會這樣。 我誤解了這些命令是如何工作的嗎?
您正確應用這些方法,如果最大特征值的絕對值明顯大於0,它們將給出相同的結果。您觀察到的結果的原因是基於用於確定特征值的算法的迭代性質。 從文檔 :
“這個函數是ARPACK [R209] SNEUPD,DNEUPD,CNEUPD,ZNEUPD的函數,它使用隱式重啟的Arnoldi方法來找到特征值和特征向量[R210]。” 如果您對此算法的詳細信息感興趣,可以在此處找到解釋。
與所有數值方法一樣,您只能以一定的精度確定所需的值。 對於明顯不等於0的特征值,您將始終獲得相同的輸出; 對於接近0的值,您可能會獲得不同的值,如上例所示。
您可以嘗試更改參數“maxiter”和“tol”(查看上面引用的文檔以獲取詳細信息),您可以將其傳遞給“eigs”。 Maxiter是允許的最大Arnoldi更新迭代次數 - 通過增加數量,您應該獲得更准確的結果。 “Tol”是算法的特征值和停止准則的相對准確度。
很抱歉在這里回答一個舊問題,但另一個答案並不十分令人滿意。
隨機性不是與ARPACK捆綁的算法的一部分,而是算法的初始化 。 從scipy文檔中 ,初始化v0是隨機的,除非用戶指定。 果然,我們看到了這一點(注意設置略有不同 - w的條目縮放為[0,1]):
import numpy
from scipy.sparse.linalg import eigs
from scipy import sparse
w = sparse.rand(10, 10, 0.1)
w = w/w.max()
如果我們不指定v0,我們會得到一些(輕微的)隨機性:
>>> print max(abs(eigs(w)[0]))
0.00024188777676476916
>>> print max(abs(eigs(w)[0]))
0.00028073646868200566
>>> print max(abs(eigs(w)[0]))
0.00025250058038424729
>>> print max(abs(eigs(w)[0]))
0.00018183677959035711
但是,如果我們指定初始化,我們總會得到相同的答案:
>>> print numpy.all([max(abs(eigs(w, v0 = numpy.ones(10))[0])) == 0.00026363015600771211 for k in range(1000)])
True
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.