我有一些問題,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