numpy Python:np.linalg.eigvalsh返回负特征值

uinbv5nw  于 2023-04-21  发布在  Python
关注(0)|答案(1)|浏览(340)

我有一个7x7的协方差矩阵(表示为numpy数组)。

t = np.array(
    [
        [1.4, 0.3, 0.4, 0.8, 0.4, 0.9, 0.3],
        [0.3, 1.3, 0.4, 2.3, 0.4, 2.4, 0.4],
        [0.4, 0.4, 1.3, 2.8, 0.4, 1.0, 0.3],
        [0.8, 2.3, 2.8, 9.5, 1.0, 7.0, 1.0],
        [0.4, 0.4, 0.4, 1.0, 1.1, 1.2, 0.3],
        [0.9, 2.4, 1.0, 7.0, 1.2, 7.7, 1.0],
        [0.3, 0.4, 0.3, 1.0, 0.3, 1.0, 0.5],
    ],
    dtype=np.float64,
)

我已经检查过这个矩阵是对称的。

np.allclose(t, t.T)
True

并且np.linalg.svd返回有效的非负奇异值。然而,np.linalg.eigvalsh返回负特征值。

min(np.linalg.eigvalsh(t))
-0.06473876145336957

这对我来说没有太大意义,因为我已经检查过矩阵的列是线性独立的(得到矩阵的减少的行梯队形式)。

import sympy
reduced_form, inds = sympy.Matrix(t.values).rref()

我看到类似的问题,人们报告eigvalsh返回一个行为良好的矩阵的负特征值,但没有一个建议有帮助。示例:

  1. Why is scipy's eigh returning unexpected negative eigenvalues?
  2. numpy.cov or numpy.linalg.eigvals gives wrong results
    我想知道是否有人在NP.Linalg.Eigvalsh上遇到过类似的问题,并对如何解决它有任何建议?
    非常感谢。
b4lqfgs4

b4lqfgs41#

对称矩阵的特征值为负是完全正常的。一个矩阵是厄米特矩阵只保证它的特征值是 * 真实的 *。它不保证特征值是正的。
协方差矩阵的特征值为负是不正常的,这意味着这实际上不是协方差矩阵,不管你怎么想。也许你舍入了实际协方差矩阵的元素?

相关问题