我读到过在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,否则。
发布于 2019-03-14 16:50:54
你可以看看分解是否起作用了。通过将矩阵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中使用的检查标准不必太严格,因为它可能能够处理某些半定矩阵。
https://stackoverflow.com/questions/55103221
复制相似问题