У меня возникают проблемы с функцией eigh
scipy, возвращающей отрицательные собственные значения для положительных полуопределенных матриц. Ниже представлен MWE.
Функция hess_R
возвращает положительную полуопределенную матрицу (это сумма матрицы первого ранга и диагональной матрицы, обе с неотрицательными элементами).
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
Напечатаны собственные значения
[ -6.74055241e-271 4.62855397e+016 5.15260753e+018]
Если я заменю np.float64
на np.float32
в операторе возврата hess_R
, я получу
[ -5.42905303e+10 4.62854925e+16 5.15260506e+18]
вместо этого, поэтому я предполагаю, что это какая-то проблема с точностью.
Есть ли способ исправить это? Технически мне не нужно использовать восемь, но я думаю, что это основная проблема с другими моими ошибками (извлечение квадратных корней из этих матриц, получение NaN и т. д.).
LA.eig
вместо LA.eigh, я получаю другие собственные значения:[ 5.15260753e+18+0.j 3.22785571e+01+0.j 4.62855397e+16+0.j]
- person Peaceful   schedule 24.04.2016Hess_R
не возвращает фактическую матрицу Гессе. поэтомуeigh
возвращает ложный результат в вашем случае. - person B. M.   schedule 24.04.20163.14000000e+02, 4.62855397e+16, 5.15260753e+18
сscipy.linalg.eigh
и1.06862038e+02, 4.62855397e+16, 5.15260753e+18
сnumpy.linalg.eigh
для вашего примераH
(разница также может быть частично связана с потерей точности при выводе значений с плавающей запятой вx
в виде строк). - person ali_m   schedule 24.04.2016np.ones(d*d).reshape(d,d)
наnp.ones((d, d))
. - person Warren Weckesser   schedule 24.04.2016