提问者:小点点

Cholesky分解半正定矩阵


我读过numpy/scipy中矩阵的Cholesky分解只有当它是正定的时才起作用。实际上,由于矩阵是半正定的,下面的方法是行不通的

np.linalg.cholesky([[1, 0], [0, 0]])
numpy.linalg.linalg.LinAlgError: Matrix is not positive definite

然而,我使用的是一个对称的半正定矩阵,Numpy对它进行了无误差的分解:

np.linalg.cholesky([[2, 6], [6, 18]])
array([[1.41421356e+00, 0.00000000e+00],
      [4.24264069e+00, 5.64928468e-08]])

发生什么事了?在我的测试中,两个矩阵都是半正定的,但从我读到的,我期望NUMPY/SCIPY中的Cholesky分解只适用于正定矩阵,并给出一个线性函数,否则。


共1个答案

匿名用户

你可以看一看分解是否起作用了。通过将矩阵与其转置相乘,您应该得到初始矩阵:

>>> import numpy as np
>>> L = np.array([[1.41421356e+00, 0.00000000e+00],
...       [4.24264069e+00, 5.64928468e-08]])
>>> L.dot(L.T)
array([[ 1.99999999,  5.99999999],
       [ 5.99999999, 18.00000002]])

你的矩阵的特征值是,所以它是正半定的。

我的结论是,这个算法可能有效,但不能保证算法给出合理的结果。同样,你也可以用共轭梯度来解一个方程组,即使这个方程组不是厄米矩阵。虽然共轭梯度有时是有效的,但它可能不那么有效。

也许NumPy中使用的检验准则不必太严格,因为它可能能够处理某些半定矩阵。