Effiziente Berechnung der inversen Matrix in R

21

Ich muss die inverse Matrix berechnen und habe die solveFunktion verwendet. Während es bei kleinen Matrizen gut funktioniert solve, ist es bei großen Matrizen tendenziell sehr langsam. Ich habe mich gefragt, ob es eine andere Funktion oder Kombination von Funktionen gibt (über SVD, QR, LU oder andere Zerlegungsfunktionen), die mir schnellere Ergebnisse liefern können.

jitendra
quelle
2
Können Sie weitere Informationen bereitstellen? Was sind die ungefähren Abmessungen? Hat die Matrix eine spezielle Struktur (Symmetrie, Sparsamkeit usw.)? Was ist Ihre quantitative Definition von "langsam"? Und schnell"?
Kardinal
Die ungefähren Abmessungen betragen 2000x2000. Die Matrix hat keine spezielle Struktur. Nun, die solveMethode erledigt definitiv meine Arbeit, aber ich möchte, dass der Algorithmus schneller ist. Ich frage mich nur, ob es eine effizientere (im Zeitkontext) Funktion zur Berechnung der Inversen für eine derart große Matrix gibt.
Jitendra
1
Haben Sie einen der anderen Vorschläge auf der Hilfeseite für ausprobiert solve? Ohne spezielle Struktur kann man sich natürlich den theoretischen Komplexitätsgrenzen der allgemeinen Matrixinversion nicht entziehen.
Kardinal
3
@Cardinal Der Trick besteht darin, die tatsächliche Anwendung genauer zu untersuchen, denn wie Sie wissen, ist das Invertieren der Matrix in vielen Fällen unnötig (und zeitaufwändig und fehleranfällig).
Whuber
@whuber: Das ist ein sehr guter Punkt. Ich nehme an, manchmal gehe ich diese Fragen etwas zu direkt an.
Kardinal

Antworten:

23

Haben Sie versucht, was Kardinal vorgeschlagen hat, und einige der alternativen Methoden zur Berechnung der Inversen untersucht? Betrachten wir ein konkretes Beispiel:

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)

Dies ist also ein Beispiel für eine Korrelationsmatrix, für die wir die Inverse wollen. Auf meinem Laptop (Core-i5 2.50Ghz) dauert es 8-9 Sekunden, etwas mehr als 4 Sekunden und 17-18 Sekunden (mehrere Code-Läufe werden empfohlen, um stabile Ergebnisse zu erzielen ).2000×2000solvechol2inv(chol())qr.solve()

Die Inverse über die Choleski-Zerlegung ist also etwa doppelt so schnell wie solve. Möglicherweise gibt es dafür sogar noch schnellere Möglichkeiten. Ich habe gerade einige der offensichtlichsten hier untersucht. Und wenn die Matrix, wie bereits in den Kommentaren erwähnt, eine spezielle Struktur hat, kann dies wahrscheinlich für mehr Geschwindigkeit ausgenutzt werden.

Wolfgang
quelle
Vielen Dank für diese Lösung. Zumindest kenne ich eine Methode, die es die Hälfte der Zeit lösen kann im Vergleich zu solve:-)
jitendra
8
Die Cholesky-Zerlegung ist eine gute Wahl für Kovarianz- / Korrelationsmatrizen, aber denken Sie daran, dass die Matrix im Allgemeinen hermitisch sein muss (im Fall von reellen Matrizen bedeutet dies symmetrisch), positiv definierte Matrix. Dies belegt die Hälfte des für die LU-Zerlegung erforderlichen Speichers.
Raxel