Cálculo eficiente de matriz inversa en R

21

Necesito calcular la matriz inversa y he estado usando la solvefunción. Si bien funciona bien en matrices pequeñas, solvetiende a ser muy lento en matrices grandes. Me preguntaba si hay alguna otra función o combinación de funciones (a través de SVD, QR, LU u otras funciones de descomposición) que puedan darme resultados más rápidos.

jitendra
fuente
2
¿Puedes proporcionar más información? ¿Cuáles son las dimensiones aproximadas? ¿Tiene la matriz alguna estructura especial (simetría, dispersión, etc.)? ¿Cuál es su definición cuantitativa de "lento"? Y rápido"?
cardenal
Las dimensiones aproximadas son como 2000x2000. La matriz no tiene ninguna estructura especial. Bueno, el solvemétodo definitivamente hace mi trabajo, pero quiero que el algoritmo sea más rápido. Entonces, me pregunto si hay una función más eficiente (en contexto de tiempo) para calcular la inversa de una matriz de gran tamaño.
jitendra
1
¿Has probado alguna de las otras sugerencias en la página de ayuda solve? Por supuesto, en ausencia de una estructura especial, no puede escapar de los límites de complejidad teórica en la inversión general de la matriz.
cardenal
3
@Cardinal El truco consiste en investigar más sobre la aplicación real, ya que, como saben, en muchos casos la inversión de la matriz es innecesaria (y consume mucho tiempo y es propensa a errores).
whuber
@whuber: Este es un muy buen punto. Supongo que a veces abordo estas preguntas un poco demasiado directamente.
cardenal

Respuestas:

23

¿Has probado lo que cardinal sugirió y exploraste algunos de los métodos alternativos para calcular el inverso? Consideremos un ejemplo 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)

Entonces, este es un ejemplo de una matriz de correlación para la que queremos lo inverso. En mi computadora portátil (Core-i5 2.50Ghz), toma 8-9 segundos, toma un poco más de 4 segundos y toma 17-18 segundos (se sugieren múltiples ejecuciones del código para obtener resultados estables).2000×2000solvechol2inv(chol())qr.solve()

Entonces, el inverso a través de la descomposición de Choleski es aproximadamente el doble de rápido que solve. Por supuesto, puede haber formas aún más rápidas de hacerlo. Acabo de explorar algunos de los más obvios aquí. Y como ya se mencionó en los comentarios, si la matriz tiene una estructura especial, entonces esto probablemente pueda explotarse para obtener más velocidad.

Wolfgang
fuente
Muchas gracias por esta solución. Yo, al menos, conozco un método que puede resolverlo la mitad del tiempo en comparación con solve:-)
jitendra
8
La descomposición de Cholesky es una buena opción para las matrices de covarianza / correlación, pero tenga en cuenta que, en general, la matriz debe ser hermitiana (en el caso de matrices reales que significa simétrica), matriz definida positiva. Eso usa la mitad de la memoria requerida para la descomposición de LU.
Raxel