繁体   English   中英

python scipy.sparse.linalg.eigs为连续调用提供不同的结果

[英]python scipy.sparse.linalg.eigs giving different results for consecutive calls

我试图计算python中稀疏矩阵的谱半径 这就是我所拥有的:

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

是什么赋予了? 我原以为每次都会这样。 我误解了这些命令是如何工作的吗?

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

“这个函数是ARPACK [R209] SNEUPD,DNEUPD,CNEUPD,ZNEUPD的函数,它使用隐式重启的Arnoldi方法来找到特征值和特征向量[R210]。” 如果您对此算法的详细信息感兴趣,可以在此处找到解释

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

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

很抱歉在这里回答一个旧问题,但另一个答案并不十分令人满意。

随机性不是与ARPACK捆绑的算法的一部分,而是算法的初始化 scipy文档中 ,初始化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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM