Эффективный расчет обратной матрицы в R

21

Мне нужно рассчитать обратную матрицу и использовать solveфункцию. Хотя он хорошо работает на маленьких матрицах, он solveимеет тенденцию быть очень медленным на больших матрицах. Мне было интересно, есть ли какая-либо другая функция или комбинация функций (через SVD, QR, LU или другие функции разложения), которые могут дать мне более быстрые результаты.

Jitendra
источник
2
Можете ли вы предоставить больше информации? Каковы приблизительные размеры? Есть ли у матрицы особая структура (симметрия, разреженность и т. Д.)? Каково ваше количественное определение «медленный»? А "быстрый"?
кардинал
Примерные размеры примерно 2000х2000. Матрица не имеет специальной структуры. Ну, solveметод определенно делает мою работу, но я хочу, чтобы алгоритм был быстрее. Итак, мне просто интересно, есть ли более эффективная (во временном контексте) функция для вычисления инверсии для матрицы такого большого размера.
Джитендра
1
Вы пробовали какие-либо другие предложения на странице справки для solve? Конечно, при отсутствии специальной структуры вы не можете выйти за пределы теоретической сложности общей инверсии матрицы.
кардинал
3
@Cardinal Хитрость заключается в том, чтобы дополнительно исследовать фактическое применение, поскольку, как вы знаете, во многих случаях инвертирование матрицы не требуется (и требует много времени и подвержено ошибкам).
whuber
@whuber: Это очень хороший момент. Полагаю, иногда я подхожу к этим вопросам слишком прямо.
кардинал

Ответы:

23

Вы пробовали, что предложил кардинал, и исследовали некоторые альтернативные методы вычисления обратного? Давайте рассмотрим конкретный пример:

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()

Таким образом, обратное через разложение Холецки примерно в два раза быстрее solve. Конечно, могут быть даже более быстрые способы сделать это. Я только что исследовал некоторые из наиболее очевидных из них здесь. И, как уже упоминалось в комментариях, если матрица имеет особую структуру, то это, вероятно, можно использовать для большей скорости.

Wolfgang
источник
Большое спасибо за это решение. Я, по крайней мере, знаю один метод, который может решить эту проблему в половине случаев по сравнению с solve:-)
jitendra
8
Разложение Холецкого является хорошим выбором для ковариационных / корреляционных матриц, но имейте в виду, что в общем случае матрица должна быть эрмитовой (в случае реальных матриц, что означает симметричная), положительно определенной матрицей. Это использует половину памяти, необходимой для декомпозиции LU.
Раксель