Calcul efficace de l'inverse de la matrice dans R

21

J'ai besoin de calculer l'inverse de la matrice et j'ai utilisé la solvefonction. Bien qu'il fonctionne bien sur les petites matrices, il a solvetendance à être très lent sur les grandes matrices. Je me demandais s'il existe une autre fonction ou combinaison de fonctions (via SVD, QR, LU ou d'autres fonctions de décomposition) qui peuvent me donner des résultats plus rapides.

jitendra
la source
2
Pouvez-vous fournir plus d'informations? Quelles sont les dimensions approximatives? La matrice a-t-elle une structure particulière (symétrie, parcimonie, etc.)? Quelle est votre définition quantitative de «lent»? Et vite"?
cardinal
Les dimensions approximatives sont comme 2000x2000. La matrice n'a pas de structure spéciale. Eh bien, la solveméthode fait définitivement mon travail mais je veux que l'algorithme soit plus rapide. Donc, je me demande simplement s'il existe une fonction plus efficace (dans le contexte temporel) pour calculer l'inverse pour une matrice de grande taille.
jitendra
1
Avez-vous essayé l'une des autres suggestions sur la page d'aide de solve? Bien sûr, en l'absence de structure spéciale, vous ne pouvez pas échapper aux limites de la complexité théorique de l'inversion de matrice générale.
cardinal
3
@Cardinal L'astuce consiste à approfondir la question concernant l'application réelle, car comme vous le savez, dans de nombreux cas, inverser la matrice est inutile (et prend du temps et est source d'erreurs).
whuber
@whuber: C'est un très bon point. Je suppose que parfois j'aborde ces questions un peu trop directement.
cardinal

Réponses:

23

Avez-vous essayé ce que le cardinal a suggéré et exploré certaines des méthodes alternatives pour calculer l'inverse? Prenons un exemple spécifique:

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×2000solvechol2inv(chol())qr.solve()

L'inverse via la décomposition de Choleski est donc environ deux fois plus rapide que solve. Il existe bien sûr des moyens encore plus rapides de le faire. Je viens d'explorer quelques-unes des plus évidentes ici. Et comme déjà mentionné dans les commentaires, si la matrice a une structure spéciale, cela peut probablement être exploité pour plus de vitesse.

Wolfgang
la source
Merci beaucoup pour cette solution. Je connais au moins une méthode qui peut le résoudre la moitié du temps par rapport à solve:-)
jitendra
8
La décomposition de Cholesky est un bon choix pour les matrices de covariance / corrélation mais gardez à l'esprit qu'en général la matrice doit être hermitienne (dans le cas de matrices réelles qui signifie symétrique), matrice définie positive. Cela utilise la moitié de la mémoire requise pour la décomposition LU.
Raxel