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

Bab*_*bak 6 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)
Run Code Online (Sandbox Code Playgroud)

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

Eri*_*ric 2

通过以下设置:

\n\n
import numpy as np\n\nN = 100\nX = np.linspace(0, 1, N*N).reshape(N, N)\nX = 0.5*(X + X.T) + np.eye(N) * N\n
Run Code Online (Sandbox Code Playgroud)\n\n

IPython我用s得到以下时间%timeit

\n\n
In [28]: %timeit np.linalg.inv(X)\n255 \xc2\xb5s \xc2\xb1 30.9 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 1000 loops each)\n\nIn [29]: %timeit c = np.linalg.inv(np.linalg.cholesky(X)); np.dot(c.T,c)\n414 \xc2\xb5s \xc2\xb1 15.4 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 1000 loops each)\n
Run Code Online (Sandbox Code Playgroud)\n