【问题标题】:scipy.sparse.linalg.eigsh with fixed seed具有固定种子的 scipy.sparse.linalg.eigsh
【发布时间】:2019-02-22 12:16:52
【问题描述】:

我正在尝试使用带有固定种子的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


    【解决方案1】:

    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)
    

    每次都有不同的结果。

    【讨论】:

      【解决方案2】:

      首先,文档没有提到参数v0 必须对种子做任何事情。它说

      v0 : ndarray,可选 迭代的起始向量。默认值:随机

      根据我的天真理解,当它开始找到 eigenvalueseigenvectors 时它的初始向量将这个参数 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)
      

      我本可以在 cmets 中再次发布此内容,但最好输入一些代码以明确您的观点。

      附言

      我可能误解了你的问题,如果是这样,请随时投反对票。

      【讨论】:

      猜你喜欢
      • 2020-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-22
      • 2012-02-13
      相关资源
      最近更新 更多