![](/img/trans.png)
[英]scipy.sparse.linalg.eigsh returns different eigenvalues for the same matrix
[英]scipy.sparse.linalg.eigsh with fixed seed
我正在嘗試將scipy.sparse.linalg.eigsh與固定種子一起使用。
為此,我需要指定 v0 參數。 但是,我無法弄清楚到底需要什么進入 v0,因為這里的文檔非常少(它只是說 numpy.ndarray),而且錯誤消息對我來說沒有任何信息。
代碼:
import numpy as np
import scipy.sparse.linalg
A = scipy.sparse.rand(10,10)
# v0 = np.random.rand(10,10)
v0 = np.random.rand(10,5)
w, v = scipy.sparse.linalg.eigsh(A, k=5, v0=v0)
錯誤:
錯誤:無法將 _arpack.dsaupd 的第 10 個參數“workd”轉換為 C/Fortran 數組
首先,文檔沒有提到參數v0
必須對種子做任何事情的任何地方。 它說
v0 : ndarray,可選的迭代起始向量。 默認值:隨機
從我天真地理解它的初始向量,當它開始尋找特征值和特征向量時,它以這個參數v0
作為初始向量開始,現在到seed
,我們使用seed
來修復為這些向量生成的數字。 所以你的問題真的沒有意義。 即使你讓這個程序運行,你也會得到不同的結果,為了避免我們使用seed
來使結果可重復。
再說一次,我在這里可能是錯的。
其次,如果您想為您的方法修復種子,我建議使用numpy
來修復種子,因為scipy
使用numpy
生成隨機數。
所以代碼看起來像這樣
import numpy as np
np.random.seed(seed= 13)
然后如果參數v0
是種子,你可以完全避免它
w, v = scipy.sparse.linalg.eigsh(A, k=5)
同樣,我本可以在評論中發布此內容,但最好添加一些代碼來闡明您的觀點。
聚苯乙烯
我可能誤解了您的問題,如果是這種情況,請隨時投反對票。
從eigsh
獲得可重現結果的正確方法是:
import numpy as np
import scipy.sparse.linalg
np.random.seed(0)
A = scipy.sparse.rand(10,10)
v0 = np.random.rand(min(A.shape))
w, v = scipy.sparse.linalg.eigsh(A, k=5, v0=v0)
每次結果都一樣。 (感謝@hpaulj 的正確評論)
請注意,在不設置v0
情況下修復種子是不夠的:
np.random.seed(0)
A = scipy.sparse.rand(10,10)
w, v = scipy.sparse.linalg.eigsh(A, k=5)
每次都有不同的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.