Çok değişkenli normal dağılımdan örneklerin çizilmesi için Cholesky ve özdöpozisyon


16

Bir örnek çizmek istiyorum . Wikipedia bir Cholesky veya Eigendecomposition kullanmanızı önerir , yani veya xN(0,Σ)Σ=D1D1TΣ=QΛQT

Ve böylece örnek şu şekilde çizilebilir: veya burada x=D1vvN(0,I)x=SΛvvN(0,I)

Wikipedia, her ikisinin de örnek üretmek için eşit derecede iyi olduğunu öne sürer, ancak Cholesky yönteminin daha hızlı hesaplama süresi vardır. Bu doğru mu? Özellikle sayısal olarak monte edilmiş bir carlo yöntemi kullanılırken, diyagonaller boyunca varyanslar birkaç büyüklük sırasına göre değişebilir mi? Bu sorunla ilgili resmi bir analiz var mı?


1
Damien, hangi programın daha hızlı olduğundan emin olmak için en iyi tarif yazılımınızda kendiniz kontrol etmektir: Cholesky ve Eigen-ayrışma işlevleri farklı uygulamalarda hız olarak değişebilir. Cholesky yolu daha popüler, AFAIK, ama öz yol potansiyel olarak daha esnek olabilir.
ttnphns

1
Cholesky'nin daha hızlı 3/3 ( Wikipedia ) olduğunu anlıyorum, oysa özdönüşüm ( Jacobi Özdeğer Algoritması . Ancak iki problemim daha var: (1) "Potansiyel olarak daha esnek" ne anlama geliyor ? ve (2) Varyanslar birkaç büyüklük sırasına göre farklılık gösterir ( en uç elemanlar için 10 - 4'e karşı 10 - 9 ) - bunun seçilen algoritma üzerinde bir etkisi var mı?O(N3/3)O(N3)104109
Damien

"Esnek" bir @Damien bir yönü için bir kovaryans matrisi tekabül için eigendecomposition, yani SVD , kesilmiş olabilir Tüm matriksin en uygun düşük seviye yaklaşım alır. Kesilen SVD, her şeyi hesaplamak ve sonra küçük özdeğerleri dışarı atmak yerine doğrudan hesaplanabilir.
GeoMatt22

Yığını Taşma'daki cevabımı okumaya ne dersiniz : Elips kovaryans grafiğinde (tarafından oluşturulmuş car::ellipse) elipsin köşelerini alın . Her ne kadar soru farklı uygulamalarda sorulsa da, arkasındaki teori aynıdır. Orada geometrik açıklama için güzel rakamlar göreceksiniz.
李哲源

Yanıtlar:


12

Problem Straka ve arkadaşları tarafından algoritmanın bir parçası olarak çok değişkenli bir Normal dağılımdan (deterministik) numuneler çeken Vurulmamış Kalman Filtresi için incelenmiştir . Biraz şansla, sonuçlar monte-carlo problemine uygulanabilir.

Cholesky Ayrışması (CD) ve Özün Ayrıştırılması (ED) - ve bu nedenle asıl Matris Karekök (MSR), pozitif yarı-belirli bir matrisin (PSD) parçalanabileceği tüm yollardır.

Göz önünde SVD PSD matrisin . P PSD olduğu için bu aslında P = U S U T olan ED ile aynıdır . Dahası, diyagonal matrisi kare kökü ile bölebiliriz: P = U P=USVTP=USUT, bunu belirterekP=USSTUT.S=ST

Şimdi keyfi bir dikey matris ekleyebiliriz :O

.P=USOOTSTUT=(USO)(USO)T

seçimi , özellikle kovaryans matrisinin güçlü köşegen olmayan elemanları olduğunda, tahmin performansını etkiler.O

Makalede üç seçeneği incelenmiştir :O

  • ED'ye karşılık gelen O = I ;O=I
  • denQR ayrışmaarasında U O=QCD'ye tekabül; veUS=QR
  • simetrik bir matrise (yani MSR) yol açan U TO=UT

Çok sayıda analizden sonra (alıntılar) makalede aşağıdaki sonuçların çıkarıldığı:

  • İlişkilendirilmemiş elementlere sahip dönüştürülecek rastgele bir değişken için, düşünülen üç MD de aynı sigma noktalarını sağlar ve bu nedenle [Vurulmamış Dönüşüm] yaklaşımının kalitesi üzerinde neredeyse hiçbir fark yaratmazlar. Böyle bir durumda CD düşük maliyetleri nedeniyle tercih edilebilir.

  • Rastgele değişken ilişkili elemanlar içeriyorsa, farklı [ayrışma] kullanımı, dönüştürülmüş rastgele değişkenin ortalama veya kovaryans matrisinin [Unscented Transform] yaklaşımının kalitesini önemli ölçüde etkileyebilir. Yukarıdaki iki vaka [ED] 'nin tercih edilmesi gerektiğini göstermiştir.

  • Dönüştürülecek değişkenin elemanları, karşılık gelen kovaryans matrisinin neredeyse tekil olması için güçlü bir korelasyon sergiliyorsa, MD'yi hesaplayan algoritmanın sayısal kararlılığı olan başka bir konu dikkate alınmalıdır. SVD neredeyse tekil kovaryans matrisleri için ChD'den çok daha sayısal olarak kararlıdır.

Referans:

  • Straka, O .; Dunik, J .; Simandl, M. & Havlik, J. "Kokusuz Kalman filtresindeki matris ayrışmalarının boyutları ve karşılaştırılması", Amerikan Kontrol Konferansı (ACC), 2013, 2013, 3075-3080.

6

İki yöntemin hesaplama süresini karşılaştırmak için R'yi kullanan basit bir örnek.

library(mvtnorm)
library(clusterGeneration)
set.seed(1234)
mean <- rnorm(1000, 0, 1)
sigma <- genPositiveDefMat(1000)
sigma <- sigma$Sigma

eigen.time <- system.time(
  rmvnorm(n=1000, mean=mean, sigma = sigma, method = "eigen")
  )

chol.time <- system.time(
  rmvnorm(n=1000, mean=mean, sigma = sigma, method = "chol")
  )

Çalışma süreleri

> eigen.time
   user  system elapsed 
   5.16    0.06    5.33 
> chol.time
   user  system elapsed 
   1.74    0.15    1.90

Örnek boyutunu 10000'e yükseltirken, çalışma süreleri

> eigen.time <- system.time(
+   rmvnorm(n=10000, mean=mean, sigma = sigma, method = "eigen")
+   )
> 
> chol.time <- system.time(
+   rmvnorm(n=10000, mean=mean, sigma = sigma, method = "chol")
+   )
> eigen.time
   user  system elapsed 
   15.74    0.28   16.19 
> chol.time
   user  system elapsed 
   11.61    0.19   11.89 

Bu yardımcı olur umarım.


3

İşte manuel ya da fakir adamlar, kendime kanıtlama gösterisi:

> set.seed(0)
> # The correlation matrix
> corr_matrix = matrix(cbind(1, .80, .2, .80, 1, .7, .2, .7, 1), nrow=3)
> nvar = 3 # Three columns of correlated data points
> nobs = 1e6 # One million observations for each column
> std_norm = matrix(rnorm(nvar * nobs),nrow=nobs, ncol=nvar) # N(0,1)   

Corr=[1.8.2.81.7.2.71]

N=[[,1][,2][,3][1,]1.08063380.65639130.8400443[2,]1.14342410.17297380.9884772[999999,]0.48618270.035630062.1176976[1000000,]0.43945511.692655171.9534729]

1. SVD YÖNTEMİ:

[U[3×3]Σ0.5[d1000d2000d3]NT[3×106]]T
> ptm <- proc.time()
> # Singular Value Decomposition method:
> svd = svd(corr_matrix)   
> rand_data_svd = t(svd$u %*% (diag(3) * sqrt(svd$d)) %*% t(std_norm))
> proc.time() - ptm
   user  system elapsed 
   0.29    0.05    0.34 
> 
> ptm <- proc.time()

2. CHOLESKY YÖNTEMİ:

[Ch[c1100c21c220c31c32c33]N-T[3x106]]T
> # Cholesky method:
> chole = t(chol(corr_matrix))
> rand_data_chole = t(chole %*% t(std_norm))
> proc.time() - ptm
   user  system elapsed 
   0.25    0.03    0.31 

@ Userr11852'ye, işlevi kullanarak SVD ve Cholesky arasındaki performans farkını hesaplamanın daha iyi bir yolu olduğunu belirttiğiniz için teşekkür ederiz microbenchmark. Onun önerisinde, sonuç şu:

microbenchmark(chol(corr_matrix), svd(corr_matrix))
Unit: microseconds
              expr     min     lq      mean  median      uq     max neval cld
 chol(corr_matrix)  24.104  25.05  28.74036  25.995  26.467  95.469   100  a 
  svd(corr_matrix) 108.701 110.12 116.27794 111.065 112.719 223.074   100   b

@ user11852 Teşekkürler. Girişi imleçle okudum microbenchmarkve gerçekten fark yaratıyor.
Antoni Parellada

Elbette, ancak tahmin performansında bir farkı var mı?
Damien

İyi bir nokta. Paketi keşfetmek için zamanım olmadı.
Antoni Parellada
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.