Julia:eigs() 函数在每次评估后返回不同的值
Julia : eigs() function returning different values after every evaluation
我注意到 运行 eigs() 函数多次运行后,每次都给出不同但近似的结果。
有什么办法可以 return 每次都得到相同的结果吗?输出有时带有“+”号或“-”号。
M的内容:
[2, 1] = 1.0
[3, 1] = 0.5
[1, 2] = 1.0
[3, 2] = 2.5
[1, 3] = 0.5
[2, 3] = 2.5
M = M+M'
(d, v) = eigs(M, nev=1, which=:LR)
我在 Python 中的同一个稀疏矩阵上尝试了 运行 相同的函数,虽然矩阵看起来有点不同,但我认为它是相同的。左边的值从 0 开始编号。在 julia 中,它们从 1 开始编号。我不知道这是否有很大区别。 Julia 和 Python 中的值大致相同,但在 Python 中它们在每次评估后始终相同。 python 中的 return 值是 复数 ,在 Julia 中 real.
Python代码:
M.T的内容:
from scipy.sparse import linalg
(1, 0) 1.0
(2, 0) 0.5
(0, 1) 1.0
(2, 1) 2.5
(0, 2) 0.5
(1, 2) 2.5
eigenvalue, eigenvector = linalg.eigs(M.T, k=1, which='LR')
知道为什么会出现这种行为吗?
编辑:
这些是 eigs 四次评估的结果
==========eigvalues==============
[2.8921298144977587]
===========eigvector=============
[-0.34667468634025667
-0.679134250677923
-0.6469878912367839]
=================================
==========eigvalues==============
[2.8921298144977596]
===========eigvector=============
[0.34667468634025655
0.6791342506779232
0.646987891236784]
=================================
==========eigvalues==============
[2.8921298144977596]
===========eigvector=============
[0.34667468634025655
0.6791342506779233
0.6469878912367841]
=================================
==========eigvalues==============
[2.8921298144977583]
===========eigvector=============
[0.3466746863402567
0.679134250677923
0.646987891236784]
=================================
eigs
的结果取决于 Lanczos 迭代的初始向量。未指定时,它是随机的,因此即使返回的所有向量都是正确的,也不能保证在不同的迭代中相位相同。
如果你希望每次的结果都一样,可以在eigs中设置v0
,例如
eigs(M, nev=1, which=:LR, v0 = ones(3))
只要 v0
没有改变,您就应该得到确定性的结果。
请注意,如果您想要确定性结果用于测试目的,您可能需要考虑允许相移的测试方案,因为相位可以随着最小的扰动而移动。例如。如果您 link 使用不同的 BLAS 或更改线程数,结果可能会再次改变。
我注意到 运行 eigs() 函数多次运行后,每次都给出不同但近似的结果。
有什么办法可以 return 每次都得到相同的结果吗?输出有时带有“+”号或“-”号。
M的内容:
[2, 1] = 1.0
[3, 1] = 0.5
[1, 2] = 1.0
[3, 2] = 2.5
[1, 3] = 0.5
[2, 3] = 2.5
M = M+M'
(d, v) = eigs(M, nev=1, which=:LR)
我在 Python 中的同一个稀疏矩阵上尝试了 运行 相同的函数,虽然矩阵看起来有点不同,但我认为它是相同的。左边的值从 0 开始编号。在 julia 中,它们从 1 开始编号。我不知道这是否有很大区别。 Julia 和 Python 中的值大致相同,但在 Python 中它们在每次评估后始终相同。 python 中的 return 值是 复数 ,在 Julia 中 real.
Python代码:
M.T的内容:
from scipy.sparse import linalg
(1, 0) 1.0
(2, 0) 0.5
(0, 1) 1.0
(2, 1) 2.5
(0, 2) 0.5
(1, 2) 2.5
eigenvalue, eigenvector = linalg.eigs(M.T, k=1, which='LR')
知道为什么会出现这种行为吗?
编辑:
这些是 eigs 四次评估的结果
==========eigvalues==============
[2.8921298144977587]
===========eigvector=============
[-0.34667468634025667
-0.679134250677923
-0.6469878912367839]
=================================
==========eigvalues==============
[2.8921298144977596]
===========eigvector=============
[0.34667468634025655
0.6791342506779232
0.646987891236784]
=================================
==========eigvalues==============
[2.8921298144977596]
===========eigvector=============
[0.34667468634025655
0.6791342506779233
0.6469878912367841]
=================================
==========eigvalues==============
[2.8921298144977583]
===========eigvector=============
[0.3466746863402567
0.679134250677923
0.646987891236784]
=================================
eigs
的结果取决于 Lanczos 迭代的初始向量。未指定时,它是随机的,因此即使返回的所有向量都是正确的,也不能保证在不同的迭代中相位相同。
如果你希望每次的结果都一样,可以在eigs中设置v0
,例如
eigs(M, nev=1, which=:LR, v0 = ones(3))
只要 v0
没有改变,您就应该得到确定性的结果。
请注意,如果您想要确定性结果用于测试目的,您可能需要考虑允许相移的测试方案,因为相位可以随着最小的扰动而移动。例如。如果您 link 使用不同的 BLAS 或更改线程数,结果可能会再次改变。