R de ters matrisin verimli hesaplanması


21

Ters matris hesaplamam gerekiyor ve solvefonksiyon kullanıyordum . Küçük matrislerde iyi çalışsa da, solvebüyük matrislerde çok yavaş olma eğilimindedir. Bana daha hızlı sonuç verebilecek başka bir fonksiyon veya fonksiyon kombinasyonlarının (SVD, QR, LU veya diğer ayrışma fonksiyonları aracılığıyla) olup olmadığını merak ediyordum.


2
Daha fazla bilgi verebilir misiniz? Yaklaşık boyutlar nelerdir? Matrisin özel bir yapısı var mı (simetri, seyreklik vb.)? "Yavaş" için kantitatif tanımınız nedir? Ve hızlı"?
kardinal

Yaklaşık boyutlar 2000x2000 gibidir. Matrisin özel bir yapısı yoktur. Şey, solveyöntem kesinlikle işimi yapıyor ama algoritmanın daha hızlı olmasını istiyorum. Bu yüzden, böyle büyük boyutlu bir matris için ters hesaplamak için daha verimli (zaman bağlamında) bir fonksiyon olup olmadığını merak ediyorum.
jitendra

1
Yardım sayfasındaki diğer önerilerden herhangi birini denediniz solvemi? Tabii ki, özel bir yapı yoksa, genel matris inversiyonundaki teorik karmaşıklık sınırlarından kaçamazsınız.
kardinal,

3
@Cardinal Püf noktası, gerçek uygulama ile ilgili daha fazla araştırma yapmaktır, çünkü bildiğiniz gibi, çoğu durumda matrisi ters çevirmek gereksizdir (ve zaman alıcı ve hataya açık).
whuber

@ whuber: Bu çok iyi bir nokta. Sanırım bazen bu sorulara doğrudan doğrudan yaklaşıyorum.
kardinal

Yanıtlar:


23

Kardinal'in önerdiği şeyi denedim ve tersini hesaplamak için alternatif yöntemlerden bazılarını araştırdınız mı? Belirli bir örneği ele alalım:

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)

Bu, bunun tersini istediğimiz korelasyon matrisine bir örnektir . Dizüstü bilgisayarımda (Core-i5 2.50Ghz), 8-9 saniye sürüyor, 4 saniyeden biraz fazla sürüyor ve 17-18 saniye sürüyor (kodun birden fazla çalışmasının kararlı sonuçlar alması önerilir).2000x2000solvechol2inv(chol())qr.solve()

Böylece Choleski'nin ayrışması yoluyla tersi iki kat daha hızlıdır solve. Elbette bunu yapmanın daha hızlı yolları olabilir. Buradaki en belirgin olanları araştırdım. Yorumlarda da belirtildiği gibi, eğer matris özel bir yapıya sahipse, o zaman bu muhtemelen daha fazla hız için kullanılabilir.


Bu çözüm için çok teşekkürler. Ben, en azından karşılaştırıldığında o yarım saat çözebilir bu bir yöntem biliyorum solve:-)
jitendra

8
Cholesky ayrışması, kovaryans / korelasyon matrisleri için iyi bir seçimdir, ancak genel olarak matrisin Hermitian (simetrik anlamına gelen gerçek matrisler olması durumunda), pozitif kesin matris olması gerektiğini unutmayın. LU ayrıştırması için gereken hafızanın yarısını kullanır.
Raxel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.