我有一些问题,scipy的eigh
函数返回正半定矩阵的负特征值。以下是MWE。scipy eigh给出正半定矩阵的负特征值
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]
如果我在hess_R
return语句与np.float32
取代np.float64
我得到
[ -5.42905303e+10 4.62854925e+16 5.15260506e+18]
代替,所以我猜测这是某种形式的精确问题。
有没有办法解决这个问题?从技术上讲,我不需要使用eigh,但我认为这是我的其他错误的基本问题(取这些矩阵的平方根,得到NaN等)
如果我使用'LA.eig'而不是'LA.eigh',我会得到不同的特征值:'[5.15260753e + 18 + 0.j 3.22785571e + 01 + 0.j 4.62855397e + 16 + 0.j ]' – Peaceful
恕我直言,你的'Hess_R'函数不会返回一个实际的Hessian矩阵。所以'eigh'在你的情况下返回错误的结果。 –
@ B.M。你能进一步解释你的意思吗?什么是函数返回? – angryavian