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
Ş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))
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))
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')
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 logR
hesaplamaya ek oran eklemeniz gerekir ).