我正在尝试将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的第十个参数'workd'转换为 C / Fortran数组
答案 0 :(得分:1)
首先,文档没有提及参数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)
同样,我可以在注释中发布此内容,但是最好还是添加一些代码以使您的观点清楚。
PS
我可能会误解了您的问题,如果是这种情况,请随时赞成。
答案 1 :(得分:0)
从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)
每次都有不同的结果。