Rの逆行列の効率的な計算


21

逆行列を計算する必要があり、solve関数を使用しています。小さなマトリックスでsolveはうまく機能しますが、大きなマトリックスでは非常に遅くなる傾向があります。より高速な結果を得ることができる他の機能または機能の組み合わせ(SVD、QR、LU、またはその他の分解機能を使用)があるかどうか疑問に思いました。


2
詳細情報を提供できますか?おおよその寸法は?マトリックスには特別な構造(対称性、スパース性など)がありますか?「遅い」の量的な定義は何ですか?そして「速い」?
枢機

おおよその寸法は2000x2000のようなものです。マトリックスには特別な構造はありません。まあ、solve方法は間違いなく私の仕事をしますが、私はアルゴリズムをより速くしたいです。そのため、このような大きなサイズの行列の逆行列を計算するためのより効率的な(時間コンテキストでの)関数があるのではないかと思っています。
-jitendra

1
ヘルプページの他の提案を試しましたsolveか?もちろん、特別な構造がなければ、一般的なマトリックス反転の理論的な複雑さの限界から逃れることはできません。
枢機

3
@Cardinalトリックは、実際のアプリケーションについてさらに詳しく調べることです。ご存知のように、多くの場合、マトリックスの反転は不要です(そして時間がかかり、エラーが発生しやすい)。
whuber

@whuber:これは非常に良い点です。私は時々これらの質問に少し直接アプローチしていると思います。
枢機

回答:


23

あなたは枢機inalが示唆したことを試み、逆を計算するためのいくつかの代替方法を検討しましたか?特定の例を考えてみましょう。

library(MASS)

k   <- 2000
rho <- .3

S       <- matrix(rep(rho, k*k), nrow=k)
diag(S) <- 1

dat <- mvrnorm(10000, mu=rep(0,k), Sigma=S) ### be patient!

R <- cor(dat)

system.time(RI1 <- solve(R))
system.time(RI2 <- chol2inv(chol(R)))
system.time(RI3 <- qr.solve(R))

all.equal(RI1, RI2)
all.equal(RI1, RI3)

したがって、これは例です2000年×2000年、逆行列が必要な相関行列の。私のラップトップ(Core-i5 2.50Ghz)では、solve8〜9秒chol2inv(chol())かかり、4秒以上かかり、qr.solve()17〜18秒かかります(安定した結果を得るには、コードを複数回実行することをお勧めします)。

したがって、コレスキー分解による逆は、約2倍の速さです。 solveです。もちろん、もっと高速な方法があるかもしれません。ここで最も明らかなものをいくつか探りました。また、すでにコメントで述べたように、マトリックスが特別な構造を持っている場合、おそらくこれを利用して速度を上げることができます。


このソリューションに感謝します。少なくとも、私はそれを半分の時間で解決できる方法を知っていますsolve:-)
jitendra

8
コレスキー分解は共分散/相関行列に適していますが、一般に行列はエルミート行列(対称を意味する実行列の場合)、正定行列でなければならないことに注意してください。LU分解に必要なメモリの半分を使用します。
ラクセル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.