我读过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分解只适用于正定矩阵,并给出一个线性函数,否则。
你可以看一看分解是否起作用了。通过将矩阵
>>> 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中使用的检验准则不必太严格,因为它可能能够处理某些半定矩阵。