Разложение Холецкого положительной полуопределенной матрицы - PullRequest
0 голосов
/ 11 марта 2019

Я читал, что декомпозиция Холецкого матрицы в Numpy / Scipy работает, только если она положительно определена. Действительно, следующее не работает, так как матрица является положительной полуопределенной

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 будет работать только с положительно определенными матрицами и, в противном случае, выдаст ошибку LinAlgError.

1 Ответ

0 голосов
/ 14 марта 2019

Вы можете посмотреть, сработала ли декомпозиция. Умножая вашу матрицу 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, не должен быть таким строгим, потому что он может справиться с некоторыми полуопределенными матрицами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...