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
根据我天真的理解,当它开始寻找 eigenvalues 和 eigenvectors 时,它的初始向量采用此参数 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)
每次都有不同的结果。
我正在尝试将 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
根据我天真的理解,当它开始寻找 eigenvalues 和 eigenvectors 时,它的初始向量采用此参数 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)
每次都有不同的结果。