用Cholesky分解反转numpy矩阵的效率

时间:2017-06-03 15:07:24

标签: python performance numpy matrix matrix-inverse

我有一个对称的正定矩阵(例如协方差矩阵),我想计算它的逆。在数学中,我知道使用Cholesky分解来反转矩阵更有效,特别是如果你的矩阵很大。但我不确定" 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)

哪一个更有效(inverse1或inverse2)?如果第二个更有效,为什么numpy.linalg.inv()不使用它呢?

1 个答案:

答案 0 :(得分:1)

使用以下设置:

import numpy as np

N = 100
X = np.linspace(0, 1, N*N).reshape(N, N)
X = 0.5*(X + X.T) + np.eye(N) * N

我通过IPython' %timeit获得以下时间安排:

In [28]: %timeit np.linalg.inv(X)
255 µs ± 30.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [29]: %timeit c = np.linalg.inv(np.linalg.cholesky(X)); np.dot(c.T,c)
414 µs ± 15.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)