Python 为什么通过Cholesky分解反演正定矩阵比使用numpy进行常规反演要慢?

Python 为什么通过Cholesky分解反演正定矩阵比使用numpy进行常规反演要慢?,python,r,numpy,scipy,matrix-inverse,Python,R,Numpy,Scipy,Matrix Inverse,数学上已知,通过Cholesky分解求正定矩阵的逆比仅使用np.linalg.inv(X)更快。然而,当我尝试两者时,结果证明Cholesky分解的性能更差 # Inversion through Cholesky p = X.shape[0] Ip = np.eye(p) %timeit scipy.linalg.cho_solve(scipy.linalg.cho_factor(X,lower=True), Ip) The slowest run took 17.96 times long

数学上已知,通过Cholesky分解求正定矩阵的逆比仅使用
np.linalg.inv(X)
更快。然而,当我尝试两者时,结果证明Cholesky分解的性能更差

# Inversion through Cholesky
p = X.shape[0]
Ip = np.eye(p)
%timeit scipy.linalg.cho_solve(scipy.linalg.cho_factor(X,lower=True), Ip)

The slowest run took 17.96 times longer than the fastest. This could mean that an intermediate result is being cached.
10000 loops, best of 3: 107 µs per loop


# Simple inversion
%timeit np.linalg.inv(X)

The slowest run took 58.81 times longer than the fastest. This could mean that an intermediate result is being cached.
10000 loops, best of 3: 25.9 µs per loop

后者花的时间更短。为什么会这样?在
R
中,
chol2inv(chol(X))
通常比
solve(X)

我对1000x1000个矩阵进行了比较,通过Cholesky进行的反演速度大约是原来的两倍。

也许你的矩阵太小了。我刚刚在Matlab中使用Cholesky分解和LU分解测试了$2\times2$矩阵的矩阵求逆。999999次重复使用Cholesky需要5秒,使用LU只需要3.4秒。事实上,Cholesky后接反代换的算法有一个较小的大O结果,但该结果是一个渐近结果,仅适用于大矩阵

#LU decomposition
tic
for i=1:999999
    (V_i(:,:,2)+[0 1e-10;0 0])\eye(2);
end
toc
Elapsed time is 3.430676 seconds.

#Cholesky
tic
for i=1:999999
    (V_i(:,:,2))\eye(2);
end
toc
Elapsed time is 4.824175 seconds.

np.linalg.inv使用并行处理。在运行这两个函数时检查cpu峰值。如果您使用并行处理来运行多个inv或Cholesky,您会发现Cholesky更快

什么是
p
?我刚用
p=1000
试过,Cholesky更快了。@WarrenWeckesser我用100试过。。。它只是随着它变大而变快吗?那可能是。也许Cholesky方法的开销更大一些。您已经看到必须进行两次函数调用,而不是一次。事实上,为了公平起见,您还应该在Cholesky方法的计时中包含
Ip
的创建。