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

问题描述 投票:0回答:1

我有一个 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. 为什么 scipy 的 eigh 会返回意外的负特征值?
  2. numpy.cov 或 numpy.linalg.eigvals 给出错误的结果

我想知道是否有人遇到过与 np.linalg.eigvalsh 类似的问题并对如何解决它有任何建议?

非常感谢。

python numpy matrix scipy linear-algebra
1个回答
0
投票

对称矩阵具有负特征值是完全正常的。 Hermitian 矩阵仅保证其特征值是 real。它不保证特征值是正的。

协方差矩阵具有负特征值是不正常的,这意味着这实际上不是协方差矩阵,不管你怎么想。也许您舍入了实际协方差矩阵的条目?

© www.soinside.com 2019 - 2024. All rights reserved.