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
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))
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))
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')
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 logR
phép tính).