MCMC Metropolis-Hastings varyasyonları ile karıştırılır: Random-Walk, Random-Walk, Bağımsız, Metropolis


15

Son birkaç haftadır MCMC'yi ve Metropolis-Hastings algoritmalarını anlamaya çalışıyorum. Ne zaman anlasam yanlış olduğumu anlıyorum. On-line bulmak kod örnekleri çoğu açıklama ile tutarlı olmayan bir şey uygulamak. yani: Metropolis-Hastings'i uyguladıklarını söylüyorlar ama aslında rastgele yürüyüş metropolü uyguluyorlar. Diğerleri (neredeyse her zaman), Simetrik bir teklif dağıtımı kullandıkları için Hastings düzeltme oranının uygulanmasını sessizce atlar. Aslında, oranı şimdiye kadar hesaplayan basit bir örnek bulamadım. Bu beni daha da karıştırıyor. Birisi bana aşağıdakilerin kod örneklerini verebilir mi (herhangi bir dilde):

  • Hastings düzeltme oranı hesaplamalı Vanilya Rastgele Olmayan Yürüyüş Metropolis-Hastings Algoritması (simetrik bir teklif dağıtımı kullanılırken bu 1 olsa bile).
  • Vanilya Rastgele Yürüme Metropolis-Hastings algoritması.
  • Vanilya Bağımsız Metropolis-Hastings algoritması.

Metropolis algoritmalarını sağlamaya gerek yok çünkü eğer yanılmıyorsam Metropolis ve Metropolis-Hastings arasındaki tek fark, ilklerinin her zaman simetrik bir dağılımdan örnek alması ve bu nedenle Hastings düzeltme oranının olmamasıdır. Algoritmaların ayrıntılı açıklamasına gerek yoktur. Temelleri anlıyorum ama Metropolis-Hastings algoritmasının farklı varyasyonları için tüm farklı isimlerle değil, aynı zamanda Vanilya rastgele olmayan yürüyüş MH'sinde Hastings düzeltme oranını pratik olarak nasıl uyguladığınızla karıştırıyorum. Lütfen sorularımı kısmen cevaplayan yapıştırma bağlantılarını kopyalamayın, çünkü büyük olasılıkla onları zaten görmüştüm. Bu bağlantılar beni bu karışıklığa götürdü. Teşekkür ederim.

Yanıtlar:


10

İşte başlıyoruz - üç örnek. Ben mantığı daha net hale getirmek için gerçek bir uygulamada olacağını daha az verimli kod yaptım (umarım.)

# We'll assume estimation of a Poisson mean as a function of x
x <- runif(100)
y <- rpois(100,5*x)  # beta = 5 where mean(y[i]) = beta*x[i]

# Prior distribution on log(beta): t(5) with mean 2 
# (Very spread out on original scale; median = 7.4, roughly)
log_prior <- function(log_beta) dt(log_beta-2, 5, log=TRUE)

# Log likelihood
log_lik <- function(log_beta, y, x) sum(dpois(y, exp(log_beta)*x, log=TRUE))

# Random Walk Metropolis-Hastings 
# Proposal is centered at the current value of the parameter

rw_proposal <- function(current) rnorm(1, current, 0.25)
rw_p_proposal_given_current <- function(proposal, current) dnorm(proposal, current, 0.25, log=TRUE)
rw_p_current_given_proposal <- function(current, proposal) dnorm(current, proposal, 0.25, log=TRUE)

rw_alpha <- function(proposal, current) {
   # Due to the structure of the rw proposal distribution, the rw_p_proposal_given_current and
   # rw_p_current_given_proposal terms cancel out, so we don't need to include them - although
   # logically they are still there:  p(prop|curr) = p(curr|prop) for all curr, prop
   exp(log_lik(proposal, y, x) + log_prior(proposal) - log_lik(current, y, x) - log_prior(current))
}

# Independent Metropolis-Hastings
# Note: the proposal is independent of the current value (hence the name), but I maintain the
# parameterization of the functions anyway.  The proposal is not ignorable any more
# when calculation the acceptance probability, as p(curr|prop) != p(prop|curr) in general.

ind_proposal <- function(current) rnorm(1, 2, 1) 
ind_p_proposal_given_current <- function(proposal, current) dnorm(proposal, 2, 1, log=TRUE)
ind_p_current_given_proposal <- function(current, proposal) dnorm(current, 2, 1, log=TRUE)

ind_alpha <- function(proposal, current) {
   exp(log_lik(proposal, y, x)  + log_prior(proposal) + ind_p_current_given_proposal(current, proposal) 
       - log_lik(current, y, x) - log_prior(current) - ind_p_proposal_given_current(proposal, current))
}

# Vanilla Metropolis-Hastings - the independence sampler would do here, but I'll add something
# else for the proposal distribution; a Normal(current, 0.1+abs(current)/5) - symmetric but with a different
# scale depending upon location, so can't ignore the proposal distribution when calculating alpha as
# p(prop|curr) != p(curr|prop) in general

van_proposal <- function(current) rnorm(1, current, 0.1+abs(current)/5)
van_p_proposal_given_current <- function(proposal, current) dnorm(proposal, current, 0.1+abs(current)/5, log=TRUE)
van_p_current_given_proposal <- function(current, proposal) dnorm(current, proposal, 0.1+abs(proposal)/5, log=TRUE)

van_alpha <- function(proposal, current) {
   exp(log_lik(proposal, y, x)  + log_prior(proposal) + ind_p_current_given_proposal(current, proposal) 
       - log_lik(current, y, x) - log_prior(current) - ind_p_proposal_given_current(proposal, current))
}


# Generate the chain
values <- rep(0, 10000) 
u <- runif(length(values))
naccept <- 0
current <- 1  # Initial value
propfunc <- van_proposal  # Substitute ind_proposal or rw_proposal here
alphafunc <- van_alpha    # Substitute ind_alpha or rw_alpha here
for (i in 1:length(values)) {
   proposal <- propfunc(current)
   alpha <- alphafunc(proposal, current)
   if (u[i] < alpha) {
      values[i] <- exp(proposal)
      current <- proposal
      naccept <- naccept + 1
   } else {
      values[i] <- exp(current)
   }
}
naccept / length(values)
summary(values)

Vanilya örneği için şunu elde ederiz:

> naccept / length(values)
[1] 0.1737
> summary(values)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  2.843   5.153   5.388   5.378   5.594   6.628 

düşük bir kabul olasılığı, ancak yine de ... teklifin ayarlanması burada yardımcı olabilir veya farklı bir teklif kabul edebilir. İşte rastgele yürüyüş önerisi sonuçları:

> naccept / length(values)
[1] 0.2902
> summary(values)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  2.718   5.147   5.369   5.370   5.584   6.781 

Birinin umduğu gibi benzer sonuçlar ve daha iyi bir kabul olasılığı (bir parametre ile ~% 50 hedefleyen).

Ve, bütünlük için, bağımsızlık örnekleyicisi:

> naccept / length(values)
[1] 0.0684
> summary(values)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  3.990   5.162   5.391   5.380   5.577   8.802 

Posteriorun şekline "uyum sağlamadığı" için, en zayıf kabul olasılığına sahip olma eğilimindedir ve bu problem için iyi ayarlanması zordur.

Genel olarak konuşursak, yağlı kuyruklu teklifleri tercih edeceğimizi, ancak bu başka bir konudur.


Q

1
@floyd - örneğin dağıtım merkezinin konumu hakkında iyi bir fikriniz varsa (örneğin, MLE veya MOM tahminlerini hesapladığınız için) ve yağlı kuyruklu bir teklif seçebiliyorsanız, bazı durumlarda yararlıdır. ya da yineleme başına hesaplama süresi çok düşükse, bu durumda çok uzun bir zincir çalıştırabilirsiniz (bu da düşük kabul oranlarını oluşturur) ve böylece verimsiz çalışma süresinden bile daha büyük olabilecek analiz ve programlama zamanından tasarruf etmenizi sağlar. Bununla birlikte, tipik bir ilk deneme teklifi olmayacaktır, bu muhtemelen rastgele yürüyüş olacaktır.
jbowman

Qp(xt+1|xt)

1
p(xt+1|xt)=p(xt+1)

1

Görmek:

q()x

Wikipedia makalesi iyi tamamlayıcı bir okuma. Gördüğünüz gibi, Metropolis'in bir "düzeltme oranı" vardır, ancak yukarıda belirtildiği gibi Hastings simetrik olmayan teklif dağılımlarına izin veren bir değişiklik getirmiştir.

Metropolis algoritması R paketinde mcmcşu komutla uygulanır metrop().

Diğer kod örnekleri:

http://www.mas.ncl.ac.uk/~ndjw1/teaching/sim/metrop/

http://pcl.missouri.edu/jeff/node/322

http://darrenjw.wordpress.com/2010/08/15/metropolis-hastings-mcmc-algorithms/


Cevabın için teşekkürler. Maalesef sorularımın hiçbirine cevap vermiyor. Sadece rastgele yürüyüş metropolü, rastgele yürüyüş metropolü ve bağımsız MH görüyorum. dnorm(can,mu,sig)/dnorm(x,mu,sig)İlk bağlantının bağımsızlık örnekleyicisindeki Hastings düzeltme oranı 1'e eşit değildir. Simetrik bir teklif dağılımı kullanılırken 1'e eşit olması gerektiğini düşündüm. Bunun nedeni, rastgele olmayan bir MH değil, bağımsız bir örnekleyici olması mı? Yanıtınız evetse, Rastgele Olmayan Düz bir MH için Hastings oranı nedir?
AstrOne

p(current|proposal)=p(proposal|current)
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.