乔尔斯基分解正半定矩阵

时间:2019-03-11 13:44:28

标签: python numpy scipy

我已经读到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分解仅适用于正定矩阵,否则给出LinAlgError。

1 个答案:

答案 0 :(得分:0)

您可以查看分解是否有效。通过将矩阵L与其转置相乘,您几乎可以得到初始矩阵:

>>> 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]])

当查看矩阵的特征值时,它们分别是0.20.,所以它是正半定值。

我会得出结论,所使用的算法可能确实有效,但是您不能保证它实际上会给出合理的结果。同样,即使系统不是厄米矩阵,也可以使用共轭梯度求解方程组。有时它可以工作,但是在那里也可能不起作用。

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