บรรณานุกรมระบุว่าหาก q เป็นการกระจายแบบสมมาตรอัตราส่วน q (x | y) / q (y | x) จะกลายเป็น 1 และอัลกอริทึมนั้นเรียกว่า Metropolis ถูกต้องหรือไม่
ใช่ถูกต้องแล้ว อัลกอริทึม Metropolis เป็นกรณีพิเศษของอัลกอริทึม MH
แล้ว "Random Walk" Metropolis (-Hastings) ล่ะ? มันแตกต่างจากอีกสองคนอย่างไร
ในการเดินสุ่มการกระจายข้อเสนอจะถูกจัดให้อยู่กึ่งกลางอีกครั้งหลังจากแต่ละขั้นตอนที่ค่าที่สร้างขึ้นล่าสุดโดยสายโซ่ โดยทั่วไปในการเดินสุ่มการกระจายข้อเสนอคือเกาส์ซึ่งในกรณีนี้การเดินแบบสุ่มตรงตามข้อกำหนดด้านสมมาตรและอัลกอริธึมคือมหานคร ฉันคิดว่าคุณสามารถทำการเดินสุ่มหลอกด้วยการกระจายแบบอสมมาตรซึ่งจะทำให้ข้อเสนอลอยไปในทิศทางตรงกันข้ามของการเอียงมากเกินไป (การกระจายเบ้ซ้ายจะสนับสนุนข้อเสนอทางด้านขวา) ฉันไม่แน่ใจว่าทำไมคุณถึงทำเช่นนี้ แต่คุณทำได้และมันจะเป็นอัลกอริธึมเฮสติ้งในมหานคร (นั่นคือต้องใช้คำเพิ่มเติมอัตราส่วน)
มันแตกต่างจากอีกสองคนอย่างไร
ในอัลกอริธึมการเดินที่ไม่ใช่แบบสุ่มการแจกแจงข้อเสนอจะได้รับการแก้ไข ในชุดการเดินแบบสุ่มศูนย์กลางของการกระจายข้อเสนอจะเปลี่ยนในแต่ละการวนซ้ำ
เกิดอะไรขึ้นถ้าการกระจายข้อเสนอเป็นการกระจายปัวซอง?
ถ้าอย่างนั้นคุณต้องใช้ MH แทนมหานคร สมมุติว่านี่คือตัวอย่างการกระจายแบบไม่ต่อเนื่องมิฉะนั้นคุณจะไม่ต้องการใช้ฟังก์ชันแยกเพื่อสร้างข้อเสนอของคุณ
ไม่ว่าในกรณีใดหากการแจกแจงการสุ่มตัวอย่างถูกตัดทอนหรือคุณมีความรู้ก่อนหน้านี้เกี่ยวกับความเบ้คุณอาจต้องการใช้การกระจายการสุ่มตัวอย่างแบบอสมมาตรและดังนั้นจึงจำเป็นต้องใช้การตีนครหลวง
มีคนให้รหัสง่ายๆกับฉัน (C, python, R, pseudo-code หรืออะไรก็ได้ที่คุณต้องการ)
นี่คือเมืองใหญ่:
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))
}
ลองใช้สิ่งนี้เพื่อดูตัวอย่างการกระจาย bimodal ก่อนอื่นเรามาดูกันว่าจะเกิดอะไรขึ้นถ้าเราใช้การเดินแบบสุ่มสำหรับอุปกรณ์ประกอบฉากของเรา:
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
ตอนนี้ลองสุ่มตัวอย่างโดยใช้การแจกแจงข้อเสนอคงที่และดูว่าเกิดอะไรขึ้น:
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
สิ่งนี้ดูโอเคในตอนแรก แต่ถ้าเราดูความหนาแน่นด้านหลัง ...
plot(density(y_trace2))
เราจะเห็นว่ามันติดอยู่ที่ค่าสูงสุดในท้องถิ่น สิ่งนี้ไม่น่าแปลกใจเลยที่เราให้ความสำคัญกับการกระจายข้อเสนอเป็นหลัก สิ่งเดียวกันจะเกิดขึ้นถ้าเราให้ความสำคัญกับสิ่งนี้ในโหมดอื่น:
response2b <- Metropolis(F_sample = test
,F_prop = function(x){rnorm(1, 7, sqrt(10) )}
,I=1e5
)
plot(density(response2b[[1]]))
เราสามารถลองลดข้อเสนอของเราระหว่างสองโหมด แต่เราจะต้องตั้งค่าความแปรปรวนให้สูงเพื่อให้มีโอกาสสำรวจทั้งสองอย่าง
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!
สังเกตว่าตัวเลือกของศูนย์กลางการกระจายข้อเสนอของเรามีผลกระทบอย่างมีนัยสำคัญต่ออัตราการยอมรับของตัวอย่าง
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
เรายังคงติดอยู่ในสองโหมดที่ใกล้กว่า ลองทำสิ่งนี้โดยตรงระหว่างสองโหมด
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')
ในที่สุดเราก็ใกล้ชิดกับสิ่งที่เรากำลังมองหา ในทางทฤษฎีถ้าเราปล่อยให้ตัวอย่างทำงานนานพอเราจะได้ตัวอย่างตัวแทนจากการแจกแจงข้อเสนอใด ๆ แต่การเดินสุ่มสร้างตัวอย่างที่ใช้งานได้อย่างรวดเร็วและเราต้องใช้ประโยชน์จากความรู้ของเราว่า เพื่อดูการปรับแต่งแก้ไขการสุ่มตัวอย่างการกระจายการผลิตที่มีผลใช้งานได้ (ซึ่งความจริงจะบอกเราไม่ได้ค่อนข้างมี แต่ในy_trace4
)
ฉันจะพยายามอัปเดตด้วยตัวอย่างของการวางผังเมืองในภายหลัง คุณควรจะเห็นวิธีง่าย ๆ ในการแก้ไขโค้ดข้างต้นเพื่อให้เกิดอัลกอริธึมเฮสติ้งมหานคร (คำแนะนำ: คุณเพียงแค่ต้องเพิ่มอัตราส่วนเสริมลงในการlogR
คำนวณ)