具有固定种子的scipy.sparse.linalg.eigsh

时间:2018-09-18 12:47:03

标签: python scipy sparse-matrix eigenvalue

我正在尝试将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数组

2 个答案:

答案 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)

每次都有不同的结果。