Tính toán hiệu quả nghịch đảo ma trận trong R


21

Tôi cần tính toán nghịch đảo ma trận và đã được sử dụng solvehàm. Trong khi nó hoạt động tốt trên các ma trận nhỏ, solvecó xu hướng rất chậm trên các ma trận lớn. Tôi đã tự hỏi nếu có bất kỳ chức năng hoặc sự kết hợp chức năng nào khác (thông qua SVD, QR, LU hoặc các chức năng phân tách khác) có thể cho tôi kết quả nhanh hơn.


2
bạn có thể cung cấp thêm thông tin không? Các kích thước gần đúng là gì? Ma trận có cấu trúc đặc biệt nào không (tính đối xứng, độ thưa, v.v.)? Định nghĩa định lượng của bạn về "chậm" là gì? Va nhanh nhẹn"?
Đức hồng y

Kích thước gần đúng giống như 2000x2000. Ma trận không có cấu trúc đặc biệt nào. Vâng, solvephương pháp chắc chắn làm công việc của tôi nhưng tôi muốn thuật toán nhanh hơn. Vì vậy, tôi chỉ tự hỏi liệu có một hàm hiệu quả hơn (trong bối cảnh thời gian) để tính toán nghịch đảo cho ma trận kích thước lớn như vậy.
jitendra

1
Bạn đã thử bất kỳ đề xuất nào khác trên trang trợ giúp solvechưa? Tất nhiên, không có cấu trúc đặc biệt, bạn không thể thoát khỏi giới hạn phức tạp về mặt lý thuyết về đảo ngược ma trận chung.
Đức hồng y

3
@Cardinal Bí quyết là thăm dò thêm về ứng dụng thực tế, như bạn biết, trong nhiều trường hợp, việc đảo ngược ma trận là không cần thiết (và tốn thời gian và dễ bị lỗi).
whuber

@whuber: Đây là một điểm rất tốt. Tôi cho rằng đôi khi tôi tiếp cận những câu hỏi này một cách quá trực tiếp.
Đức hồng y

Câu trả lời:


23

Bạn đã thử những gì hồng y gợi ý và khám phá một số phương pháp thay thế để tính toán nghịch đảo chưa? Hãy xem xét một ví dụ cụ thể:

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

Vì vậy, nghịch đảo thông qua phân tách Choleski nhanh gấp khoảng hai lần solve. Tất nhiên có thể có những cách thậm chí nhanh hơn để làm điều đó. Tôi chỉ khám phá một số trong những người rõ ràng nhất ở đây. Và như đã đề cập trong các ý kiến, nếu ma trận có cấu trúc đặc biệt, thì điều này có lẽ có thể được khai thác để có thêm tốc độ.


Cảm ơn rất nhiều cho giải pháp này. Tôi, ít nhất, biết một phương pháp có thể giải quyết được một nửa thời gian so với solve:-)
jitendra

8
Phân rã Cholesky là một lựa chọn tốt cho ma trận hiệp phương sai / tương quan nhưng hãy nhớ rằng nói chung ma trận phải là Hermiti (trong trường hợp ma trận thực có nghĩa là đối xứng), ma trận xác định dương. Điều đó sử dụng một nửa bộ nhớ cần thiết cho phân tách LU.
Raxel 6/03/2015
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.