Nhầm lẫn với các biến thể của MCMC Metropolis-Hastings: Đi bộ ngẫu nhiên, Đi bộ không ngẫu nhiên, Độc lập, Đô thị


15

Trong vài tuần qua, tôi đã cố gắng tìm hiểu MCMC và thuật toán của Metropolis-Hastings. Mỗi lần tôi nghĩ tôi hiểu điều đó tôi lại nhận ra mình sai. Hầu hết các ví dụ mã tôi tìm thấy trên mạng thực hiện một cái gì đó không phù hợp với mô tả. tức là: Họ nói rằng họ thực hiện Metropolis-Hastings nhưng họ thực sự thực hiện đô thị đi bộ ngẫu nhiên. Những người khác (hầu như luôn luôn) âm thầm bỏ qua việc thực hiện tỷ lệ hiệu chỉnh Hastings vì họ đang sử dụng phân phối đề xuất đối xứng. Trên thực tế, tôi đã không tìm thấy một ví dụ đơn giản nào tính toán tỷ lệ cho đến nay. Điều đó khiến tôi càng bối rối hơn. Ai đó có thể cho tôi ví dụ mã (bằng bất kỳ ngôn ngữ nào) sau đây:

  • Vanilla Thuật toán đi bộ không ngẫu nhiên của Vanilla với phép tính tỷ lệ hiệu chỉnh Hastings (ngay cả khi điều này sẽ kết thúc bằng 1 khi sử dụng phân phối đề xuất đối xứng).
  • Thuật toán Vanilla Random Walk Metropolis-Hastings.
  • Thuật toán Vanilla độc lập đô thị-Hastings.

Không cần phải cung cấp các thuật toán của Metropolis bởi vì nếu tôi không nhầm lẫn sự khác biệt duy nhất giữa Metropolis và Metropolis-Hastings là các thuật toán đầu tiên luôn lấy mẫu từ một phân phối đối xứng và do đó chúng không có tỷ lệ hiệu chỉnh Hastings. Không cần phải giải thích chi tiết về các thuật toán. Tôi hiểu những điều cơ bản nhưng tôi hơi bối rối với tất cả các tên khác nhau cho các biến thể khác nhau của thuật toán Metropolis-Hastings mà còn với cách bạn thực hiện thực tế tỷ lệ hiệu chỉnh Hastings trên MH không đi bộ ngẫu nhiên của Vanilla. Vui lòng không sao chép các liên kết dán trả lời một phần câu hỏi của tôi vì rất có thể tôi đã nhìn thấy chúng. Những liên kết đó đã dẫn tôi đến sự nhầm lẫn này. Cảm ơn bạn.

Câu trả lời:


10

Ở đây bạn đi - ba ví dụ. Tôi đã làm cho mã kém hiệu quả hơn nhiều so với trong một ứng dụng thực tế để làm cho logic rõ ràng hơn (tôi hy vọng.)

# 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)

Đối với bộ lấy mẫu vanilla, chúng tôi nhận được:

> 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 

đó là xác suất chấp nhận thấp, nhưng vẫn ... điều chỉnh đề xuất sẽ giúp ích ở đây hoặc chấp nhận một đề xuất khác. Đây là kết quả đề xuất đi bộ ngẫu nhiên:

> 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 

Kết quả tương tự, như người ta hy vọng, và xác suất chấp nhận tốt hơn (nhắm tới ~ 50% với một tham số.)

Và, để hoàn thiện, bộ lấy mẫu độc lập:

> 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 

Bởi vì nó không "thích nghi" với hình dạng của hậu thế, nên nó có xu hướng có xác suất chấp nhận kém nhất và khó điều chỉnh tốt nhất cho vấn đề này.

Lưu ý rằng nói chung, chúng tôi muốn các đề xuất có đuôi béo hơn, nhưng đó là một chủ đề hoàn toàn khác.


Q

1
@floyd - chẳng hạn, rất hữu ích trong một số tình huống, nếu bạn có ý tưởng đúng đắn về vị trí của trung tâm phân phối (ví dụ: vì bạn đã tính toán ước tính MLE hoặc MOM) và có thể chọn đề xuất có đuôi phân phối hoặc nếu thời gian tính toán trên mỗi lần lặp là rất thấp trong trường hợp bạn có thể chạy một chuỗi rất dài (bù cho tỷ lệ chấp nhận thấp) - do đó giúp bạn tiết kiệm thời gian phân tích và lập trình, có thể lớn hơn nhiều so với thời gian chạy không hiệu quả. Tuy nhiên, đây không phải là đề xuất thử đầu tiên điển hình, đó có thể là bước đi ngẫu nhiên.
jbowman

Qp(xt+1|xt)

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

1

Xem:

q()x

Các bài viết Wikipedia là một bổ sung tốt đọc. Như bạn có thể thấy, Đô thị cũng có "tỷ lệ hiệu chỉnh", nhưng như đã đề cập ở trên, Hastings đã đưa ra một sửa đổi cho phép phân phối đề xuất không đối xứng.

Thuật toán Metropolis được triển khai trong gói R mcmctheo lệnh metrop().

Ví dụ mã khác:

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-alacticms /


Cảm ơn bạn đã trả lời của bạn. Thật không may, nó không trả lời bất kỳ câu hỏi của tôi. Tôi chỉ thấy đô thị đi bộ ngẫu nhiên, đô thị đi bộ không ngẫu nhiên và MH độc lập. Tỷ lệ hiệu chỉnh Hastings dnorm(can,mu,sig)/dnorm(x,mu,sig)trong bộ lấy mẫu độc lập của liên kết đầu tiên không bằng 1. Tôi nghĩ rằng nó được cho là bằng 1 khi sử dụng phân phối đề xuất đối xứng. Đây có phải là vì đó là một bộ lấy mẫu độc lập và không phải là MH không ngẫu nhiên đi bộ? Nếu có, tỷ lệ Hastings cho MH không đi bộ ngẫu nhiên là bao nhiêu?
AstrOne

p(current|proposal)=p(proposal|current)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.