Calcolo efficiente dell'inverso della matrice in R


21

Ho bisogno di calcolare l'inverso della matrice e ho usato la solvefunzione. Mentre funziona bene su piccole matrici, solvetende ad essere molto lento su grandi matrici. Mi chiedevo se ci fossero altre funzioni o combinazioni di funzioni (tramite SVD, QR, LU o altre funzioni di decomposizione) che possano darmi risultati più veloci.


2
Potete fornire maggiori informazioni? Quali sono le dimensioni approssimative? La matrice ha una struttura speciale (simmetria, scarsità, ecc.)? Qual è la tua definizione quantitativa di "lento"? E veloce"?
cardinale

Le dimensioni approssimative sono come 2000x2000. La matrice non ha alcuna struttura speciale. Bene, il solvemetodo fa sicuramente il mio lavoro, ma voglio che l'algoritmo sia più veloce. Quindi, mi chiedo solo se esiste una funzione più efficiente (nel contesto del tempo) per calcolare l'inverso per una matrice di dimensioni così grandi.
jitendra,

1
Hai provato qualcuno degli altri suggerimenti nella pagina di aiuto per solve? Naturalmente, in assenza di una struttura speciale, non puoi sfuggire ai limiti teorici della complessità sull'inversione della matrice generale.
cardinale

3
@Cardinal Il trucco è sondare ulteriormente riguardo all'applicazione effettiva, poiché come sapete, in molti casi l'inversione della matrice non è necessaria (e richiede tempo ed è soggetta a errori).
whuber

@whuber: questo è un ottimo punto. Suppongo che a volte mi rivolgo a queste domande un po 'troppo direttamente.
cardinale

Risposte:


23

Hai provato ciò che il cardinale ha suggerito ed esplorato alcuni dei metodi alternativi per calcolare l'inverso? Consideriamo un esempio specifico:

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)

Quindi, questo è un esempio di una matrice di correlazione per la quale vogliamo l'inverso. Sul mio laptop (Core-i5 2,50 Ghz), impiega 8-9 secondi, impiega poco più di 4 secondi e impiega 17-18 secondi (si consigliano più esecuzioni del codice per ottenere risultati stabili).2000×2000solvechol2inv(chol())qr.solve()

Quindi l'inverso attraverso la decomposizione di Choleski è circa il doppio della velocità solve. Naturalmente ci possono essere modi ancora più veloci per farlo. Ho appena esplorato alcuni dei più ovvi qui. E come già accennato nei commenti, se la matrice ha una struttura speciale, probabilmente questa può essere sfruttata per una maggiore velocità.


Grazie mille per questa soluzione. Almeno conosco un metodo che può risolverlo per metà del tempo rispetto a solve:-)
jitendra

8
La decomposizione di Cholesky è una buona scelta per le matrici di covarianza / correlazione, ma tieni presente che in generale la matrice deve essere eremita (nel caso di matrici reali che significa simmetrica), matrice definita positiva. Che utilizza metà della memoria richiesta per la decomposizione LU.
Raxel,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.