2017-06-03 16 views
1

私は対称正定値行列(例えば、共分散行列)を持ち、その逆数を計算したい。数学では、特に行列が大きければ、行列を逆転するためにコレスキー分解を使用する方が効率的であることがわかります。しかし、私はどのように "numpy.lianlg.inv()"が動作するのか分かりませんでした。次のコードがあるとします:コレスキー分解でnumpyで行列を反転する効率

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)? 2番目の方が効率的な場合は、numpy.linalg.inv()が代わりにこれを使用しないのはなぜですか?次のセットアップで

+0

- numpyのは、あなたの行列が対称であることを知らない、そうすることはできません後者の方法を使用してください。行列が対称であるかどうかを確認するのが遅くなります。 – Eric

+0

'inv'は' cholesky'が三角形であるという事実を利用していないことに注意してください。— lapackの 'DTRTRI'を使わない – Eric

+0

Xが正定ではないと主張してコードが実行されませんオーバーフローする) – Eric

答えて

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 

I取得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) 
関連する問題