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)

따라서 이것은 우리가 반대를 원하는 상관 행렬 의 예입니다 . 내 노트북 ​​(Core-i5 2.50Ghz)에서 8-9 초가 걸리고 4 초 이상 조금 걸리며 17-18 초가 걸립니다 (여러 코드를 실행하면 안정적인 결과를 얻을 수 있습니다).2000 년×2000 년solvechol2inv(chol())qr.solve()

따라서 Choleski 분해를 통한 역수는 약 2 배 빠릅니다 solve. 물론 더 빠른 방법이있을 수 있습니다. 나는 여기서 가장 명백한 것들 중 일부를 탐구했습니다. 그리고 주석에서 이미 언급했듯이 매트릭스가 특별한 구조를 가지고 있다면 아마도 더 빠른 속도로 활용 될 수 있습니다.


이 솔루션에 감사드립니다. 나는 적어도 solve:-)에 비해 절반으로 해결할 수있는 방법을 알고있다
jitendra

8
hole 레 스키 분해는 공분산 / 상관 행렬에 대한 좋은 선택이지만 일반적으로 행렬은 양수 한정 행렬 인 에르 미트 (대칭을 의미하는 실제 행렬의 경우) 여야합니다. LU 분해에 필요한 메모리의 절반을 사용합니다.
Raxel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.