给定一个正半定矩阵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"代码本身也许是收敛方面的一些问题,但我真的说不出来。