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

标签 python scipy sparse-matrix eigenvalue

我正在尝试计算 spectral radius 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

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

最佳答案

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

随机性不是与 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

关于python scipy.sparse.linalg.eigs 为连续调用提供不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30966881/

相关文章:

Python矩阵乘法索引交换内存使用示例

python 样式指南 pep 8。多行多列字典

python - 为什么 scipy 的稀疏求解器给出了错误的答案?

python - 如何访问 python groupby 对象值

python - 如何用scipy计算单边公差区间

python - numpy.cov() 函数是如何实现的?

python - 有没有一种方法可以对 SciPy 的随机变量进行算术运算?

python - Scipy.stats T 分布的置信区间与手动计算时不同

c++ - RcppEigen 稀疏矩阵插入操作给出无效类 “dgCMatrix” 错误

android - SparseArray 错误 : Call requires API level S