Sto riscontrando alcuni problemi con la funzione eigh
di scipy che restituisce autovalori negativi per matrici semidefinite positive. Di seguito è riportato un MWE.scipy eigh fornisce autovalori negativi per matrice semidefinita positiva
La funzione hess_R
restituisce una matrice semidefinita positiva (è la somma di una matrice di rango uno e di una matrice diagonale, entrambe con voci non negative).
import numpy as np
from scipy import linalg as LA
def hess_R(x):
d = len(x)
H = np.ones(d*d).reshape(d,d)/(1 - np.sum(x))**2
H = H + np.diag(1/(x**2))
return H.astype(np.float64)
x = np.array([ 9.98510710e-02 , 9.00148922e-01 , 4.41547488e-10])
H = hess_R(x)
w,v = LA.eigh(H)
print w
Gli autovalori stampati sono
[ -6.74055241e-271 4.62855397e+016 5.15260753e+018]
Se sostituisco np.float64
con np.float32
nella dichiarazione ritorno di hess_R
ottengo
[ -5.42905303e+10 4.62854925e+16 5.15260506e+18]
invece, in modo da sto indovinando questo è una sorta di problema di precisione.
C'è un modo per risolvere questo problema? Tecnicamente non ho bisogno di usare Eigh, ma penso che questo sia il problema di fondo con i miei altri errori (prendendo radici quadrate di queste matrici, ottenendo NaNs, ecc.)
Se utilizzo 'LA.eig' invece di 'LA.eigh', ottengo diversi autovalori:' [5.15260753e + 18 + 0.j 3.22785571e + 01 + 0.j 4.62855397e + 16 + 0.j ] ' – Peaceful
IMHO, la tua funzione' Hess_R' non restituisce una vera matrice di iuta. quindi 'eigh' restituisci il risultato falso nel tuo caso. –
@ B.M. Potresti spiegare ulteriormente cosa intendi? Qual è la funzione che restituisce invece? – angryavian