Hiểu về đô thị-Hastings với phân phối đề xuất bất đối xứng


13

Tôi đã cố gắng tìm hiểu thuật toán Metropolis-Hastings để viết mã để ước tính các tham số của mô hình (tức là ). Theo thư mục, thuật toán Metropolis-Hastings có các bước sau:f(x)= =một*x

  • TạoYt~q(y|xt)
  • Xt+1= ={Yt,với xác suấtρ(xt,Yt),xt,với xác suất1-ρ(xt,Yt),

trong đóρ(x,y)= =tối thiểu(f(y)f(x)*q(x|y)q(y|x),1)

Làm thế nào tôi muốn hỏi một vài câu hỏi:

  • Thư mục nói rằng nếu q là phân phối đối xứng thì tỷ lệ q(x|y)/q(y|x) trở thành 1 và thuật toán được gọi là Đô thị. Đúng không? Sự khác biệt duy nhất giữa Đô thị và Đô thị-Hastings là lần đầu tiên sử dụng phân phối đối xứng? Điều gì về đô thị "Đi bộ ngẫu nhiên" (-Hastings)? Nó khác với hai cái kia như thế nào?
  • Hầu hết mã ví dụ tôi tìm thấy trên mạng sử dụng phân phối đề xuất Gaussian q và do đó ρ(x,y)= =tối thiểu(f(y)/f(x),1) trong đó f(y)/f(x) là tỷ lệ khả năng. Điều gì xảy ra nếu phân phối đề xuất là phân phối Poisson? Tôi nghĩ rằng tôi hiểu một cách hợp lý tại sao tỷ lệ đó không trở thành 1 khi sử dụng phân phối bất đối xứng nhưng tôi không chắc chắn nếu hiểu nó về mặt toán học hay cách thực hiện nó bằng mã. Ai đó có thể cho tôi một mã đơn giản (C, python, R, mã giả hoặc bất cứ thứ gì bạn thích) của thuật toán Metropolis-Hastings bằng cách sử dụng phân phối đề xuất không đối xứng?

1
Tôi vừa nhớ lại một bài đăng blog tuyệt vời về một vấn đề liên quan, có thể điều này sẽ giúp: darrenjw.wordpress.com/2012/06/04/ Kẻ
chung_p

Câu trả lời:


19

Thư mục nói rằng nếu q là phân phối đối xứng thì tỷ lệ q (x | y) / q (y | x) trở thành 1 và thuật toán được gọi là Đô thị. Đúng không?

Vâng cái này đúng rồi. Thuật toán Metropolis là trường hợp đặc biệt của thuật toán MH.

Điều gì về đô thị "Đi bộ ngẫu nhiên" (-Hastings)? Nó khác với hai cái kia như thế nào?

Trong một bước ngẫu nhiên, phân phối đề xuất được tập trung lại sau mỗi bước ở giá trị được tạo bởi chuỗi cuối cùng. Nói chung, trong một bước đi ngẫu nhiên, phân phối đề xuất là gaussian, trong trường hợp bước đi ngẫu nhiên này thỏa mãn yêu cầu đối xứng và thuật toán là đô thị. Tôi cho rằng bạn có thể thực hiện bước đi ngẫu nhiên "giả" với phân phối không đối xứng, điều này sẽ khiến các đề xuất quá trôi theo hướng ngược lại (phân phối lệch trái sẽ nghiêng các đề xuất về phía bên phải). Tôi không chắc tại sao bạn sẽ làm điều này, nhưng bạn có thể và nó sẽ là một thuật toán vội vàng đô thị (nghĩa là yêu cầu thuật ngữ tỷ lệ bổ sung).

Nó khác với hai cái kia như thế nào?

Trong thuật toán đi bộ không ngẫu nhiên, các phân phối đề xuất được cố định. Trong biến thể đi bộ ngẫu nhiên, trung tâm của phân phối đề xuất thay đổi ở mỗi lần lặp.

Điều gì xảy ra nếu phân phối đề xuất là phân phối Poisson?

Sau đó, bạn cần sử dụng MH thay vì chỉ đô thị. Có lẽ điều này sẽ là lấy mẫu phân phối rời rạc, nếu không bạn sẽ không muốn sử dụng một chức năng riêng biệt để tạo các đề xuất của mình.

Trong mọi trường hợp, nếu phân phối lấy mẫu bị cắt bớt hoặc bạn có kiến ​​thức trước về độ lệch của nó, bạn có thể muốn sử dụng phân phối lấy mẫu không đối xứng và do đó cần phải sử dụng phương pháp đô thị.

Ai đó có thể cho tôi một mã đơn giản (C, python, R, mã giả hoặc bất cứ điều gì bạn thích) không?

Đây là đô thị:

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

Hãy thử sử dụng điều này để lấy mẫu phân phối lưỡng kim. Trước tiên, hãy xem điều gì xảy ra nếu chúng ta sử dụng một bước đi ngẫu nhiên cho đạo cụ của mình:

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

nhập mô tả hình ảnh ở đây

Bây giờ, hãy thử lấy mẫu bằng cách sử dụng phân phối đề xuất cố định và xem điều gì xảy ra:

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

Điều này thoạt nhìn có vẻ ổn, nhưng nếu chúng ta nhìn vào mật độ sau ...

plot(density(y_trace2))

nhập mô tả hình ảnh ở đây

chúng ta sẽ thấy rằng nó hoàn toàn bị mắc kẹt ở mức tối đa địa phương. Điều này không hoàn toàn đáng ngạc nhiên vì chúng tôi thực sự tập trung vào phân phối đề xuất của chúng tôi ở đó. Điều tương tự cũng xảy ra nếu chúng ta tập trung vào chế độ này:

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

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

Chúng tôi có thể thử bỏ đề xuất của mình giữa hai chế độ, nhưng chúng tôi sẽ cần đặt phương sai thực sự cao để có cơ hội khám phá một trong hai chế độ

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! 

Lưu ý cách lựa chọn trung tâm phân phối đề xuất của chúng tôi có tác động đáng kể đến tỷ lệ chấp nhận của người lấy mẫu của chúng tôi.

plot(density(y_trace3))

nhập mô tả hình ảnh ở đây

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

Chúng tôi vẫn bị kẹt ở gần hơn trong hai chế độ. Hãy thử thả nó trực tiếp giữa hai chế độ.

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

nhập mô tả hình ảnh ở đây

Cuối cùng, chúng ta đang tiến gần hơn đến những gì chúng ta đang tìm kiếm. Về mặt lý thuyết, nếu chúng ta để cho bộ lấy mẫu chạy đủ lâu, chúng ta có thể lấy một mẫu đại diện từ bất kỳ phân phối đề xuất nào, nhưng bước đi ngẫu nhiên tạo ra một mẫu có thể sử dụng rất nhanh, và chúng ta phải tận dụng kiến ​​thức của chúng ta về cách thức hậu xử để tìm cách điều chỉnh các phân phối lấy mẫu cố định để tạo ra một kết quả có thể sử dụng được (điều này, sự thật mà nói, chúng ta chưa hoàn toàn hiểu được y_trace4).

Tôi sẽ cố gắng cập nhật với một ví dụ về sự vội vàng của đô thị sau này. Bạn sẽ có thể thấy khá dễ dàng cách sửa đổi mã trên để tạo ra thuật toán vội vàng đô thị (gợi ý: bạn chỉ cần thêm tỷ lệ bổ sung vào logRphép tính).


Câu trả lời tuyệt vời! Cảm ơn bạn rất nhiều! Trong trường hợp của tôi, tôi có một mô hình tham số 6-7 và tôi không biết phân phối sau có thể trông như thế nào (nhưng nó có thể là lưỡng kim) vì các bộ dữ liệu của tôi đôi khi hoàn toàn khác nhau. Dựa trên những gì bạn đã nói, tôi có thể sử dụng Metropolis (-Hastings) bằng cách sử dụng một phương sai rất lớn trong phân phối đề xuất hoặc sử dụng Random Walk Metropolis (-Hastings) với phương sai nhỏ hơn trong phân phối đề xuất. Trong mọi trường hợp đặc biệt, giải pháp thứ hai sẽ hội tụ nhanh hơn đến phân phối mục tiêu. Đúng?
AstrOne

Bây giờ liên quan đến mã Metropolis-Hastings tôi đã nghĩ để thay thế R=exp(logR)bằng mã này: R=exp(logR)*(dnorm(y[t-1],y.prop,my_sigma)/dnorm(y.prop,y[t-1],my_sigma))cho cả MH đi bộ ngẫu nhiên và không ngẫu nhiên. Đúng không?
AstrOne

1
Về cơ bản, nhưng như tôi đã đề cập trong mã đô thị: bạn muốn thực hiện các tính toán của mình trong không gian nhật ký. Tính toán khả năng có xu hướng hoạt động trên các giá trị rất nhỏ, do đó, bạn thường nhận được kết quả tốt hơn nhiều khi thêm logarit và lũy thừa kết quả của bạn so với nhân các giá trị thô với nhau.
David Marx

1
Bạn không cần phải lo lắng về trạng thái hiện tại của chuỗi (tức là ) khi bạn đang sử dụng phân phối đề xuất cố định vì: . Một phân phối đề xuất cố định tạo ra các đề xuất độc lập. Chúng tôi tính đến trong tỷ lệ đô thị. yt-1q(yt|yt-1)= =q(yt)yt-1
David Marx

1
Bạn nêu "Trong thuật toán đi bộ không ngẫu nhiên, các phân phối đề xuất được cố định. Trong biến thể đi bộ ngẫu nhiên, trung tâm của phân phối đề xuất thay đổi ở mỗi lần lặp" không đúng. Các phiên bản MH không đi bộ ngẫu nhiên hầu hết có các đề xuất phụ thuộc vào trạng thái hiện tại của chuỗi Markov, đôi khi thậm chí tập trung ở trạng thái này. Một ví dụ chính là thuật toán Langevin MCMC. Khi đề xuất được cố định, đây là một thuật toán MH độc lập .
Tây An
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.