Cálculo eficiente da matriz inversa em R

21

Eu preciso calcular a matriz inversa e tenho usado a solvefunção. Embora funcione bem em matrizes pequenas, solvetende a ser muito lento em matrizes grandes. Eu queria saber se existe alguma outra função ou combinação de funções (por meio de SVD, QR, LU ou outras funções de decomposição) que possa me fornecer resultados mais rápidos.

jitendra
fonte
2
Voce pode fornecer mais informação? Quais são as dimensões aproximadas? A matriz possui alguma estrutura especial (simetria, escarsidade etc.)? Qual é a sua definição quantitativa de "lento"? E rápido"?
cardeal
As dimensões aproximadas são como 2000 x 2000. A matriz não possui nenhuma estrutura especial. Bem, o solvemétodo definitivamente faz o meu trabalho, mas quero que o algoritmo seja mais rápido. Então, estou me perguntando se existe uma função mais eficiente (no contexto do tempo) para calcular inverso para uma matriz de tamanho tão grande.
precisa saber é o seguinte
1
Você já tentou alguma das outras sugestões na página de ajuda solve? Obviamente, na falta de estrutura especial, você não pode escapar dos limites da complexidade teórica na inversão geral da matriz.
cardeal
3
@ Cardinal O truque é investigar mais a respeito da aplicação real, pois como você sabe, em muitos casos, a inversão da matriz é desnecessária (e demorada e propensa a erros).
whuber
@ whuber: Este é um ponto muito bom. Suponho que, às vezes, abordo essas perguntas um pouco diretamente demais.
cardeal

Respostas:

23

Você já experimentou o que o cardeal sugeriu e explorou alguns dos métodos alternativos para calcular o inverso? Vamos considerar um exemplo específico:

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)

Então, este é um exemplo de um matriz de correlação para o qual queremos que o inverso. No meu laptop (Core-i5 2.50Ghz), leva de 8 a 9 segundos, demora um pouco mais de 4 segundos e leva de 17 a 18 segundos (várias execuções do código são sugeridas para obter resultados estáveis).2000×2000solvechol2inv(chol())qr.solve()

Portanto, o inverso via decomposição de Choleski é duas vezes mais rápido que solve. É claro que pode haver maneiras ainda mais rápidas de fazer isso. Eu acabei de explorar alguns dos mais óbvios aqui. E, como já mencionado nos comentários, se a matriz tiver uma estrutura especial, isso provavelmente poderá ser explorado para obter mais velocidade.

Wolfgang
fonte
Muito obrigado por esta solução. Eu, pelo menos, saber um método que pode resolvê-lo metade do tempo em comparação com solve:-)
jitendra
8
A decomposição de Cholesky é uma boa opção para matrizes de covariância / correlação, mas tenha em mente que, em geral, a matriz deve ser hermitiana (no caso de matrizes reais, que significa simétrica), matriz definida positiva. Isso usa metade da memória necessária para a decomposição da LU.
Raxel 6/03/15