scipy.linalg.eig が一貫性のない結果を返すことがあります。しかし、毎回ではありません。
>>> import numpy as np
>>> import scipy.linalg as lin
>>> modmat=np.random.random((150,150))
>>> modmat=modmat+modmat.T # the data i am interested in is described by real symmetric matrices
>>> d,v=lin.eig(modmat)
>>> dx=d.copy()
>>> vx=v.copy()
>>> d,v=lin.eig(modmat)
>>> np.all(d==dx)
False
>>> np.all(v==vx)
False
>>> e,w=lin.eigh(modmat)
>>> ex=e.copy()
>>> wx=w.copy()
>>> e,w=lin.eigh(modmat)
>>> np.all(e==ex)
True
>>> e,w=lin.eigh(modmat)
>>> np.all(e==ex)
False
私は最高の線形代数の魔法使いではありませんが、固有分解が本質的に奇妙な丸め誤差の影響を受けることは理解していますが、計算を繰り返すと異なる値になる理由がわかりません。しかし、私の結果と再現性はさまざまです。
問題の性質は正確には何ですか - まあ、結果が許容できるほど異なる場合もあれば、そうでない場合もあります。ここではいくつかの例を示します。
>>> d[1]
(9.8986888573772465+0j)
>>> dx[1]
(9.8986888573772092+0j)
上記の ~3e-13 の差は、それほど大きな問題ではないようです。代わりに、(少なくとも私の現在のプロジェクトでは) 本当の問題は、固有値の一部が適切な符号に一致しないように見えることです。
>>> np.all(np.sign(d)==np.sign(dx))
False
>>> np.nonzero(np.sign(d)!=np.sign(dx))
(array([ 38, 39, 40, 41, 42, 45, 46, 47, 79, 80, 81, 82, 83,
84, 109, 112]),)
>>> d[38]
(-6.4011617320002525+0j)
>>> dx[38]
(6.1888785138080209+0j)
MATLAB の同様のコードには、この問題はないようです。