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


21

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


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. Конечно, могут быть даже более быстрые способы сделать это. Я только что исследовал некоторые из наиболее очевидных из них здесь. И, как уже упоминалось в комментариях, если матрица имеет особую структуру, то это, вероятно, можно использовать для большей скорости.


Большое спасибо за это решение. Я, по крайней мере, знаю один метод, который может решить эту проблему в половине случаев по сравнению с solve:-)
— jitendra

8
Разложение Холецкого является хорошим выбором для ковариационных / корреляционных матриц, но имейте в виду, что в общем случае матрица должна быть эрмитовой (в случае реальных матриц, что означает симметричная), положительно определенной матрицей. Это использует половину памяти, необходимой для декомпозиции LU.
— Раксель
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.