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

3

给定一个半正定矩阵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。我不知道如何判断非常小的数字是否应该为零。

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


1
@tschm 对于一个半正定矩阵,不存在负特征值。 - Simd
啊,没有读到半正定。啊,那时候还没有它 :-) - tschm
什么是np?(我猜测是numpy,但我不想猜测。) - GreenMatt
3
你可以通过移动矩阵来避免一些问题,例如添加单位矩阵的倍数并使用反幂迭代计算n个最小特征值。在某些时候,你需要一个类似于零点的阈值。有时被称为正则化参数... - tschm
1
有没有适用于Python的任意精度线性代数库?也许可以考虑使用http://mpmath.org/? - Simd
显示剩余2条评论
2个回答

1

首先,您可能希望检查矩阵是否可逆。一种方法是使用numpy.linalg.det计算行列式。如果不可逆,您可以将此矩阵投影到正交于核的空间中。投影后的矩阵现在将是可逆的,并且具有最小幅度特征值为原始矩阵中最小(按幅度)的非零特征值。


0

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

    np.isclose(a,b)

使用公差值来比较两个数的相似度,这并不是一种完美的解决方案,但通常被认为是一种安全的比较方法。至于“eigh”代码本身,可能存在收敛问题,但我无法确定。


这是否安全取决于最小非零特征值的大小。 - Simd
确实如此。只有你可以确定公差应该是多少。这是一个工程问题,而不是数学问题。 - armatita

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接