Разложение Холецкого является хорошим вариантом, если вы работаете с положительно определенными (PD) матрицами.
Однако, оно выдает следующую ошибку на положительной полу -определенной (PSD) матрицескажем,
A = np.zeros((3,3)) // the all-zero matrix is a PSD matrix
np.linalg.cholesky(A)
LinAlgError: Matrix is not positive definite -
Cholesky decomposition cannot be computed
Для матриц PSD вы можете использовать восемь () scipy / numpy, чтобы проверить, что все собственные значения неотрицательны.
>> E,V = scipy.linalg.eigh(np.zeros((3,3)))
>> E
array([ 0., 0., 0.])
Однако вы, скорее всего,столкнуться с проблемами численной стабильности.Чтобы преодолеть это, вы можете использовать следующую функцию:
def isPSD(A, tol=1e-8):
E,V = scipy.linalg.eigh(A)
return np.all(E > -tol)
, которая возвращает True для матриц, которые приблизительно соответствуют PSD с заданным допуском.