我正在尝试使用固定种子的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)
我可以在评论中发布这个内容,但最好放一些代码来明确你的观点。
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)
每次都有不同的结果。