У меня есть симметричная положительно-определенная матрица (например, матрица ковариации), и я хочу вычислить ее обратную. Что касается математики, я знаю, что для инвертирования матрицы более эффективно использовать разложение Холецкого, особенно если ваша матрица большая. Но я не был уверен, как работает «numpy.lianlg.inv ()». Скажем, у меня есть следующий код:
import numpy as np
X = np.arange(10000).reshape(100,100)
X = X + X.T - np.diag(X.diagonal()) # symmetry
X = np.dot(X,X.T) # positive-definite
# simple inversion:
inverse1 = np.linalg.inv(X)
# Cholesky decomposition inversion:
c = np.linalg.inv(np.linalg.cholesky(X))
inverse2 = np.dot(c.T,c)
Какой из них более эффективен (обратный1 или обратный2)? Если второй более эффективен, почему numpy.linalg.inv () вместо этого не использует его?
inv
также не использует тот факт, чтоcholesky
треугольный, он не используетDTRTRI
лапака. - person Eric   schedule 04.06.2017inv
является дорогостоящим и нестабильным в числовом отношении. Обычно вы хотите умножить обратное на вектор, то есть хотите решить систему уравнений. Во всех таких случаях лучше просто решить систему, используя что-то вродеlinalg.solve
(указаниеsolve
, что матрица симметрична и положительно определена, заставитsolve
использовать Холецкого). Если вы хотите использовать обратное несколько раз, вычислите и сохраните разложение для дальнейшего использования. - person Praveen   schedule 04.06.2017scipy.linalg.lapack.dtrtri
- person Bananach   schedule 23.09.2020