【发布时间】:2016-08-17 14:44:37
【问题描述】:
我在使用 scipy 的 eigh 函数为正半定矩阵返回负特征值时遇到了一些问题。下面是一个 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]
如果我在hess_R 的返回语句中将np.float64 替换为np.float32,我得到
[ -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] -
恕我直言,您的
Hess_R函数不会返回实际的 Hessian 矩阵。所以eigh在您的情况下返回错误结果。 -
@B.M.你能进一步解释你的意思吗?返回的函数是什么?
-
您可能会看到不同的结果,具体取决于您的 numpy 版本所链接的 LAPACK 实现。使用 OpenBLAS v2.18 我得到
3.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作为字符串)。 -
仅供参考:您可以将
np.ones(d*d).reshape(d,d)替换为np.ones((d, d))。
标签: python numpy scipy precision eigenvalue