检查正定性或半正定性
我想用Python检查一个矩阵是否是正定矩阵或者正半定矩阵。
我该怎么做呢?在SciPy或者其他模块里有没有专门的函数可以用来做这个?
5 个回答
14
如果你在处理正定矩阵时,Cholesky分解是个不错的选择。
但是,当你遇到正半定矩阵时,它会报错,比如:
A = np.zeros((3,3)) // the all-zero matrix is a PSD matrix
np.linalg.cholesky(A)
LinAlgError: Matrix is not positive definite -
Cholesky decomposition cannot be computed
对于正半定矩阵,你可以使用scipy或numpy的eigh()函数来检查所有特征值是否都是非负的。
>> E,V = scipy.linalg.eigh(np.zeros((3,3)))
>> E
array([ 0., 0., 0.])
不过,你很可能会遇到数值稳定性的问题。为了克服这些问题,你可以使用以下函数。
def isPSD(A, tol=1e-8):
E = np.linalg.eigvalsh(A)
return np.all(E > -tol)
这个函数会在矩阵大致上是正半定的情况下返回True
,具体取决于你设定的容忍度。
19
我假设你已经知道你的矩阵是对称的。
判断一个矩阵是否是正定的一个好方法(其实是标准方法!)就是尝试计算它的Cholesky分解。如果这个分解成功了,那么说明你的矩阵是正定的。
这个方法是最直接的,因为它需要的计算量是O(n^3)(加上一个小常数),而且你至少需要进行n次矩阵和向量的乘法才能“直接”测试。
1
一个好的解决办法是计算所有的子式行列式,并检查它们是否都是非负的。