【问题标题】:python scipy.sparse.linalg.eigs giving different results for consecutive callspython scipy.sparse.linalg.eigs 为连续调用给出不同的结果
【发布时间】:2015-09-07 03:11:41
【问题描述】:

我正在尝试在 python 中计算稀疏矩阵的spectral radius。这就是我所拥有的:

from scipy.sparse.linalg import eigs
from scipy import sparse

w = sparse.rand(10, 10, 0.1)
spec_radius = max(abs(eigs(w)[0]))

w 的值被缩放到[-1,1] 的范围内。但是,每次运行该命令都会给出不同的结果:

>>> print max(abs(eigs(w)[0]))
4.51859016293e-05

>>> print max(abs(eigs(w)[0]))
4.02309443625e-06

>>> print max(abs(eigs(w)[0]))
3.7611221426e-05

什么给了?我以为每次都是一样的。我是否误解了这些命令的工作原理?

【问题讨论】:

  • 在打印命令中使用“w1”;上面你定义的“w” - 这只是一个错字吗?如果不是,“w1”是什么?
  • 打错字了,我来改一下
  • 我用你的代码尝试了不同的 w。如果 "max(abs(eigs(w)[0]))" 大于 0.01 左右,它工作得很好,并且总是获得相同的输出。但是,如果 "max(abs(eigs(w)[0]))" 远小于 0 - 如您的示例中那样 - 则获得确实不同的输出。特征值是使用 The Implicitly Restarted Arnoldi Method 计算的,这似乎是一个迭代过程。因此,我的猜测是,当特征值接近零时会遇到问题,这只是一个数值问题。
  • 啊,那一定是罪魁祸首。在我的实际代码中,在找到特征值之前,w 的值被缩放到 [-1,1] 的范围内。

标签: python scipy sparse-matrix eigenvalue


【解决方案1】:

很抱歉在这里回答一个老问题,但另一个答案不太令人满意。

随机性不是与 ARPACK 捆绑的算法的一部分,而是算法的初始化。从scipy documentation 开始,初始化 v0 是随机的,除非用户指定。果然,我们看到了这一点(注意设置略有不同——w 的条目被缩放到 [0,1] 中):

import numpy
from scipy.sparse.linalg import eigs
from scipy import sparse
w = sparse.rand(10, 10, 0.1)
w = w/w.max()

如果我们不指定 v0,我们会得到一些(轻微的)随机性:

>>> print max(abs(eigs(w)[0]))
0.00024188777676476916
>>> print max(abs(eigs(w)[0]))
0.00028073646868200566
>>> print max(abs(eigs(w)[0]))
0.00025250058038424729
>>> print max(abs(eigs(w)[0]))
0.00018183677959035711

但是,如果我们指定初始化,我们总是得到相同的答案:

>>> print numpy.all([max(abs(eigs(w, v0 = numpy.ones(10))[0])) == 0.00026363015600771211 for k in range(1000)])
True

【讨论】:

    【解决方案2】:

    您正确应用这些方法,如果最大特征值的绝对值明显大于 0,它们会给您相同的结果。您观察到结果的原因是基于算法的迭代性质,用于确定特征值。来自documentation

    “此函数是 ARPACK [R209] SNEUPD、DNEUPD、CNEUPD、ZNEUPD 的包装,这些函数使用隐式重启的 Arnoldi 方法来查找特征值和特征向量 [R210]。”如果您对该算法的细节感兴趣,您可以找到解释,例如here.

    与所有数值方法一样,您只能以一定的精度确定所需的值。对于显着不等于 0 的特征值,您将始终获得相同的输出;对于接近 0 的值,您可能会获得与上例中观察到的不同的值。

    您可以尝试更改可以传递给“eigs”的参数“maxiter”和“tol”(查看上面引用的文档了解详细信息)。 Maxiter 是允许的 Arnoldi 更新迭代的最大数量 - 通过增加数量,您应该获得更准确的结果。 “Tol”是算法的特征值和停止准则的相对精度。

    【讨论】:

    • 我对这个答案并不完全满意。 ARPACK 中有随机的东西吗?例如。一个随机生成的迭代起始向量?否则,我无法理解为什么两次运行完全相同的计算会给出不同的答案。
    猜你喜欢
    • 1970-01-01
    • 2015-08-21
    • 2018-12-01
    • 2019-01-26
    • 2020-10-15
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多