我已经读到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。
答案 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中使用的检查标准不必那么严格,因为它可能能够处理某些半定矩阵。