Ефективний розрахунок оберненої матриці в R


21

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


2
Чи можете ви надати більше інформації? Які приблизні розміри? Чи має матриця якусь особливу структуру (симетрія, розрідженість тощо)? Яке ваше кількісне визначення поняття "повільний"? А "швидка"?
кардинал

Орієнтовні розміри - 2000x2000. Матриця не має особливої ​​структури. Ну, solveметод, безумовно, робить свою роботу, але я хочу, щоб алгоритм був швидшим. Отже, мені просто цікаво, чи існує більш ефективна (у часовому контексті) функція для обчислення зворотної для такої матриці великих розмірів.
jitendra

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 рік×2000 рікsolvechol2inv(chol())qr.solve()

Тож обернення через розкладання Чолеського приблизно вдвічі швидше solve. Звичайно, можуть бути і більш швидкі способи зробити це. Я просто дослідив деякі найбільш очевидні тут. І як уже говорилося в коментарях, якщо матриця має особливу структуру, то це, ймовірно, може бути використане для більшої швидкості.


Дуже дякую за це рішення. Я, принаймні, знаю один метод, який може вирішити його вдвічі порівняно з solve:-)
jitendra

8
Розклад Холеського є хорошим вибором для матриць коваріації / кореляції, але майте на увазі, що в цілому матриця повинна бути ермітовою (у випадку реальних матриць, що означає симетричну), позитивно визначеною матрицею. Для цього використовується половина пам'яті, необхідної для розкладання LU.
Раксель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.