gpt4 book ai didi

python - scipy eigh 给出正半定矩阵的负特征值

转载 作者:太空狗 更新时间:2023-10-30 01:33:02 24 4
gpt4 key购买 nike

我对 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 等)

最佳答案

我认为问题在于您已达到浮点精度的极限。线性代数结果的一个很好的经验法则是,对于 float32,它们大约是 10^8 的一部分,对于 float 64,它们大约是 10^16 的一部分。看起来你的最小值与最大值的比率这里的特征值小于 10^-16。因此,返回值不能真正可信,并且取决于您使用的特征值实现的细节。

例如,这里有四种不同的求解器可供使用;看看他们的结果:

# using the 64-bit version
for impl in [np.linalg.eig, np.linalg.eigh, LA.eig, LA.eigh]:
w, v = impl(H)
print(np.sort(w))
reconstructed = np.dot(v * w, v.conj().T)
print("Allclose:", np.allclose(reconstructed, H), '\n')

输出:

[ -3.01441754e+02   4.62855397e+16   5.15260753e+18]
Allclose: True

[ 3.66099625e+02 4.62855397e+16 5.15260753e+18]
Allclose: True

[ -3.01441754e+02+0.j 4.62855397e+16+0.j 5.15260753e+18+0.j]
Allclose: True

[ 3.83999999e+02 4.62855397e+16 5.15260753e+18]
Allclose: True

请注意,他们都同意较大的两个特征值,但最小特征值的值在不同的实现中有所不同。尽管如此,在所有四种情况下,输入矩阵都可以重建到 64 位精度:这意味着算法可以按预期运行,达到它们可用的精度。

关于python - scipy eigh 给出正半定矩阵的负特征值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36819739/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com