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

问题描述 投票:2回答:2

我正在尝试使用固定种子的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数组失败

python scipy sparse-matrix eigenvalue
2个回答
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)

我可以在评论中发布这个内容,但最好放一些代码来明确你的观点。

P.S

我可能误解了你的问题,如果是这种情况请随时贬低。


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)

每次都有不同的结果。

© www.soinside.com 2019 - 2024. All rights reserved.