scipy.sparse.linalg.eigsh 固定种子

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)

错误:

error: failed in converting 10th argument `workd' of _arpack.dsaupd to C/Fortran array

首先,文档在任何地方都没有提到参数 v0 必须对种子做任何事情。它说

v0 : ndarray, optional Starting vector for iteration. Default: random

根据我天真的理解,当它开始寻找 eigenvalueseigenvectors 时,它的初始向量采用此参数 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)

同样,我本可以将其发布在评论中,但最好还是添加一些代码来阐明您的观点。

P.S

我可能误解了你的问题,如果是这样的话请随时投反对票。

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)

每次都有不同的结果。