簡體   English   中英

python scipy.sparse.linalg.eigs為連續調用提供不同的結果

[英]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.

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