如何计算最小的非零特征值



给定一个正半定矩阵M,我想找到它最小的非零特征值。在python中,这段代码看起来很诱人

import numpy as np
(w,v) = np.linalg.eigh(M)
minw = np.amin(w)
if (np.isclose(minw,0) and minw > 0):
    print M, minw

下面是一个示例小输入矩阵。

[ 6  2 -4 -2]
[ 2  6  0 -6]
[-4  0  6  0]
[-2 -6  0  6]

不幸的是,如果您尝试此操作,您将获得8.90238403828e-16。 我通常不知道如何判断非常小的数字是否意味着零。

如何找到矩阵的最小非零特征值(并确保它确实为非零)?

首先,您可能要检查矩阵是否可逆。一种方法是用 numpy.linalg.det 计算行列式。如果它不可逆,则可以将此矩阵投影到与内核正交的空间中。投影矩阵现在将是可逆的,其特性是最小量级的特征值将是原始矩阵的最小(量级)非零特征值。

这可能是函数中的浮动问题。解决方案将取决于问题的严重性。您可以尝试循环结果并使用函数 (numpy) 等方式查找最小值:

    np.isclose(a,b)

,使容差内的两个值具有相似性。这不是一个干净的解决方案,但通常被认为是一个安全的比较。至于"eigh"代码本身也许是收敛方面的一些问题,但我真的说不出来。

相关内容

  • 没有找到相关文章