Sto trovando che scipy.linalg.eig a volte dà risultati incoerenti. Ma non ogni volta.risultati erratici per eigendecompositions numpy/scipy
>>> 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
Mentre io non sono il più grande mago di algebra lineare, capisco che l'eigendecomposition è intrinsecamente soggetto a errori di arrotondamento strani, ma non capisco il motivo per ripetere il calcolo si tradurrebbe in un valore diverso. Ma i miei risultati e riproducibilità sono variabili.
Qual è esattamente la natura del problema - beh, a volte i risultati sono accettabilmente diversi e, a volte, non lo sono. Ecco alcuni esempi:
>>> d[1]
(9.8986888573772465+0j)
>>> dx[1]
(9.8986888573772092+0j)
La differenza sopra di ~ 3e-13 non sembra un grande affare enorme. Invece, il vero problema (almeno per il mio progetto attuale) è che alcuni degli autovalori non sembrano concordare sul segno corretto.
>>> 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)
Codice simile a MATLAB non sembra presentare questo problema.
(+1) Interessante ... – NPE
Ho cercato di riprodurre questo utilizzando NumPy 1.6.1/SciPy 0.10.1, ma non ci riuscì. – NPE
Sto usando numpy 1.6.1 e scipy 0.10.0. Inoltre, quando non ho usato copy() non ero in grado di produrre questo errore (ma esiste nella mia applicazione più grande dove sta succedendo qualcosa di simile a copy()). Il che non significa molto, perché è incredibilmente incoerente. – aestrivex