Metropolis-Hastings'i asimetrik teklif dağılımı ile anlama


14

Bir modelin parametrelerini tahmin etmek için bir kod yazmak için Metropolis-Hastings algoritmasını anlamaya çalışıyorum (yani f(x)=ax ). Kaynakçaya göre Metropolis-Hastings algoritması aşağıdaki adımlara sahiptir:

  • Y tq ( y | x t ) üretYtq(y|xt)
  • Xt+1={Yt,with probabilityρ(xt,Yt),xt,with probability1ρ(xt,Yt),

burada ρ(x,y)=min(f(y)f(x)q(x|y)q(y|x),1)

Birkaç soru nasıl sormak istiyorum:

  • Kaynakça q simetrik bir dağılım olması durumunda q (x | y) / q (y | x) oranının q(x|y)/q(y|x)1 olduğunu ve algoritmaya Metropolis adını verdiğini belirtir . Bu doğru mu? Metropolis ve Metropolis-Hastings arasındaki tek fark, ilkinin simetrik dağılım kullanmasıdır? "Random Walk" Metropolis (-Hastings) ne olacak? Diğer ikisinden farkı nedir?
  • On-line bulduğum örnek kodun çoğunda bir Gauss teklif dağılımı q ve bu nedenle ρ(x,y)=min(f(y)/f(x),1) burada f(y)/f(x) olabilirlik oranıdır. Teklif dağılımı bir Poisson dağılımı ise ne olur? Rasyonel olarak asimetrik bir dağıtım kullanırken bu oranın neden 1 olmadığını anlıyorum ama matematiksel olarak anlamak ya da kod ile uygulamak için emin değilim. Birisi bana simetrik olmayan bir teklif dağıtımı kullanarak Metropolis-Hastings algoritmasının basit bir kodunu (C, python, R, sözde kod veya tercih ettiğiniz herhangi bir örnek) verebilir mi?

1
Ben sadece ilgili bir konuda mükemmel bir blog yazısı hatırladım, belki bu yardımcı olur: darrenjw.wordpress.com/2012/06/04/…
joint_p

Yanıtlar:


20

Kaynakça q'nun simetrik bir dağılım olması durumunda q (x | y) / q (y | x) oranının 1 olduğunu ve algoritmaya Metropolis adını verdiğini belirtir. Bu doğru mu?

Evet bu doğru. Metropolis algoritması MH algoritmasının özel bir halidir.

"Random Walk" Metropolis (-Hastings) ne olacak? Diğer ikisinden farkı nedir?

Rastgele bir yürüyüşte, teklif dağılımı her adımdan sonra zincir tarafından son oluşturulan değerde yeniden ortalanır. Genellikle, rastgele bir yürüyüşte teklif dağılımı gaussian olur, bu durumda bu rastgele yürüyüş simetri ihtiyacını karşılar ve algoritma metropoldür. Sanırım, asimetrik bir dağılımla "takma" rastgele bir yürüyüş yapabilirsiniz, bu da önerilerin eğriltmenin ters yönünde çok fazla kaymasına neden olur (sol eğimli bir dağıtım, sağa doğru teklifleri tercih eder). Bunu neden yapacağınızdan emin değilim, ancak bunu yapabilirsiniz ve bir metropol hastings algoritması olabilir (yani ek oran terimini gerektirir).

Diğer ikisinden farkı nedir?

Rastgele olmayan bir yürüme algoritmasında teklif dağılımları sabittir. Rastgele yürüme varyantında, teklif dağılımının merkezi her yinelemede değişir.

Teklif dağılımı bir Poisson dağılımı ise ne olur?

O zaman metropol yerine MH kullanmanız gerekir. Muhtemelen bu, ayrık bir dağılımı örneklemek olacaktır, aksi takdirde tekliflerinizi oluşturmak için ayrık bir işlev kullanmak istemezsiniz.

Her halükarda, örnekleme dağılımı kesilirse veya eğriliği hakkında önceden bilginiz varsa, muhtemelen asimetrik bir örnekleme dağılımı kullanmak istersiniz ve bu nedenle metropol saldırıları kullanmanız gerekir.

Birisi bana basit bir kod verebilir mi (C, python, R, sözde kod veya ne istersen) örnek?

İşte metropol:

Metropolis <- function(F_sample # distribution we want to sample
                      , F_prop  # proposal distribution 
                      , I=1e5   # iterations
               ){
  y = rep(NA,T)
  y[1] = 0    # starting location for random walk
  accepted = c(1)

  for(t in 2:I)    {
    #y.prop <- rnorm(1, y[t-1], sqrt(sigma2) ) # random walk proposal
    y.prop <- F_prop(y[t-1]) # implementation assumes a random walk. 
                             # discard this input for a fixed proposal distribution

    # We work with the log-likelihoods for numeric stability.
    logR = sum(log(F_sample(y.prop))) -
           sum(log(F_sample(y[t-1])))    

    R = exp(logR)

    u <- runif(1)        ## uniform variable to determine acceptance
    if(u < R){           ## accept the new value
      y[t] = y.prop
      accepted = c(accepted,1)
    }    
    else{
      y[t] = y[t-1]      ## reject the new value
      accepted = c(accepted,0)
    }    
  }
  return(list(y, accepted))
}

Bir bimodal dağılımını örneklemek için bunu deneyelim. İlk olarak, propsal için rastgele bir yürüyüş kullanırsak ne olacağını görelim:

set.seed(100)

test = function(x){dnorm(x,-5,1)+dnorm(x,7,3)}

# random walk
response1 <- Metropolis(F_sample = test
                       ,F_prop = function(x){rnorm(1, x, sqrt(0.5) )}
                      ,I=1e5
                       )
y_trace1 = response1[[1]]; accpt_1 = response1[[2]]
mean(accpt_1) # acceptance rate without considering burn-in
# 0.85585   not bad

# looks about how we'd expect
plot(density(y_trace1))
abline(v=-5);abline(v=7) # Highlight the approximate modes of the true distribution

resim açıklamasını buraya girin

Şimdi sabit bir teklif dağıtımı kullanarak örneklemeyi deneyelim ve ne olacağını görelim:

response2 <- Metropolis(F_sample = test
                            ,F_prop = function(x){rnorm(1, -5, sqrt(0.5) )}
                            ,I=1e5
                       )

y_trace2 = response2[[1]]; accpt_2 = response2[[2]]
mean(accpt_2) # .871, not bad

İlk başta bu iyi görünüyor, ancak arka yoğunluğa bir göz atarsak ...

plot(density(y_trace2))

resim açıklamasını buraya girin

tamamen yerel bir maksimumda kaldığını göreceğiz. Teklif dağıtımımızı orada ortaladığımız için bu tamamen şaşırtıcı değil. Bunu diğer modda ortalarsak da aynı şey olur:

response2b <- Metropolis(F_sample = test
                        ,F_prop = function(x){rnorm(1, 7, sqrt(10) )}
                        ,I=1e5
)

plot(density(response2b[[1]]))

Teklifimizi iki mod arasında bırakmayı deneyebiliriz , ancak ikisini de keşfetme şansına sahip olmak için varyansı gerçekten yüksek ayarlamamız gerekecek

response3 <- Metropolis(F_sample = test
                        ,F_prop = function(x){rnorm(1, -2, sqrt(10) )}
                        ,I=1e5
)
y_trace3 = response3[[1]]; accpt_3 = response3[[2]]
mean(accpt_3) # .3958! 

Teklif dağıtımımızın merkezi seçiminin, örnekleyicimizin kabul oranı üzerinde nasıl önemli bir etkiye sahip olduğuna dikkat edin.

plot(density(y_trace3))

resim açıklamasını buraya girin

plot(y_trace3) # we really need to set the variance pretty high to catch 
               # the mode at +7. We're still just barely exploring it

Biz yine de iki moddan daha yakın takılıyorum. Bunu doğrudan iki mod arasında bırakmayı deneyelim.

response4 <- Metropolis(F_sample = test
                        ,F_prop = function(x){rnorm(1, 1, sqrt(10) )}
                        ,I=1e5
)
y_trace4 = response4[[1]]; accpt_4 = response4[[2]]

plot(density(y_trace1))
lines(density(y_trace4), col='red')

resim açıklamasını buraya girin

Sonunda aradığımız şeye yaklaşıyoruz. Teorik olarak, örnekleyicinin yeterince uzun süre çalışmasına izin verirsek, bu teklif dağılımlarından herhangi birinden temsili bir örnek alabiliriz, ancak rastgele yürüyüş çok hızlı bir şekilde kullanılabilir bir örnek oluşturdu ve posteriorun nasıl varsayıldığına dair bilgimizden yararlanmak zorunda kaldık. ayarlamak için görünüm kullanılabilir bir sonuç üretmek üzere örnekleme dağılımları sabit (Doğruyu söylemek gerekirse, biz oldukça henüz yok y_trace4).

Daha sonra bir metropol hasting örneği ile güncelleme yapmaya çalışacağım. Bir metropolis hastings algoritması üretmek için yukarıdaki kodu nasıl değiştireceğinizi kolayca görebilmeniz gerekir (ipucu: sadece logRhesaplamaya ek oran eklemeniz gerekir ).


Müthiş cevap! Çok teşekkür ederim! Benim durumumda 6-7 parametreli bir modelim var ve arka dağılımın nasıl göründüğüne dair hiçbir fikrim yok (ama bimodal olabilir) çünkü veri kümelerim bazen tamamen farklı. Söylediklerinize dayanarak, teklif dağılımında büyük bir varyans kullanarak Metropolis'i (-Hastings) kullanabilir veya teklif dağıtımında daha küçük bir varyansla Random Walk Metropolis (-Hastings) kullanabilirim. Özel bir koşul altında, ikinci çözüm hedef dağılımına daha hızlı yaklaşmalıdır. Sağ?
AstrOne

Şimdi Metropolis-Hastings koduyla ilgili olarak bunun yerine değiştirmeyi düşünüyordum R=exp(logR): R=exp(logR)*(dnorm(y[t-1],y.prop,my_sigma)/dnorm(y.prop,y[t-1],my_sigma))hem rastgele hem de rastgele olmayan yürüyüş MH için. Bu doğru mu?
AstrOne

1
Temel olarak, ama metropol kodunda bahsettiğim gibi: hesaplamalarınızı günlük alanında yapmak istiyorsunuz. Olabilirlik hesaplamaları çok küçük değerler üzerinde işlem yapma eğilimindedir, bu nedenle genellikle logaritma ekleyerek ve sonuçlarınızı katlayarak ham değerleri bir araya getirmekten çok daha iyi sonuçlar elde edersiniz.
David Marx

1
Sabit bir teklif dağıtımı kullanırken zincirin mevcut durumu (yani ) hakkında endişelenmenize gerek yoktur, çünkü: . Sabit bir teklif dağıtımı bağımsız teklifler üretir. Biz almak metropol oranında dikkate. q ( y t | y t - 1 ) = q ( y t ) y t - 1yt1q(yt|yt1)=q(yt)yt1
David Marx

1
"Rastgele olmayan bir yürüme algoritmasında, teklif dağılımları sabittir. Rastgele yürüme varyantında, teklif dağılımının merkezi her yinelemede değişir" doğru değil. Rastgele yürüyüş olmayan MH versiyonları çoğunlukla Markov zincirinin mevcut durumuna bağlı, bazen de bu duruma odaklanmış tekliflere sahiptir. Bunun en büyük örneği Langevin MCMC algoritmasıdır. Teklif düzeltildiğinde, bu bağımsız bir MH algoritmasıdır .
Xi'an
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.