Python 为什么通过Cholesky分解反演正定矩阵比使用numpy进行常规反演要慢?
数学上已知,通过Cholesky分解求正定矩阵的逆比仅使用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
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
的创建。