ทำความเข้าใจกับมหานครแห่งเฮสติ้งส์กับการกระจายข้อเสนอแบบอสมมาตร


14

ฉันพยายามที่จะเข้าใจอัลกอริทึม Metropolis-Hastings เพื่อที่จะเขียนโค้ดเพื่อประมาณค่าพารามิเตอร์ของแบบจำลอง (เช่น ) อ้างอิงจากบรรณานุกรมอัลกอริทึม Metropolis-Hastings มีขั้นตอนดังต่อไปนี้:f(x)=ax

  • สร้างYtq(y|xt)
  • Xt+1={Yt,with probabilityρ(xt,Yt),xt,with probability1ρ(xt,Yt),

ρ(x,y)=min(f(y)f(x)q(x|y)q(y|x),1)

ฉันต้องการถามคำถามสองสามข้อ:

  • บรรณานุกรมระบุว่าหากเป็นการกระจายแบบสมมาตรอัตราส่วนจะกลายเป็น 1 และอัลกอริทึมนั้นเรียกว่า Metropolis ถูกต้องหรือไม่ ความแตกต่างเพียงอย่างเดียวระหว่าง Metropolis และ Metropolis-Hastings คือสิ่งแรกที่ใช้การกระจายแบบสมมาตร? แล้ว "Random Walk" Metropolis (-Hastings) ล่ะ? มันแตกต่างจากอีกสองคนอย่างไรqq(x|y)/q(y|x)
  • โค้ดตัวอย่างส่วนใหญ่ที่ฉันพบในบรรทัดใช้การแจกแจงข้อเสนอแบบเกาส์และทำให้โดยที่เป็นอัตราส่วนความน่าจะเป็น เกิดอะไรขึ้นถ้าการกระจายข้อเสนอเป็นการกระจายปัวซอง? ฉันคิดว่าฉันเข้าใจเหตุผลว่าทำไมอัตราส่วนนั้นไม่กลายเป็น 1 เมื่อใช้การกระจายแบบไม่สมมาตร แต่ฉันก็ไม่แน่ใจว่าถ้าเข้าใจมันในเชิงคณิตศาสตร์หรือวิธีใช้กับโค้ด มีคนให้รหัสง่ายๆ (C, python, R, หลอกโค้ดหรืออะไรก็ได้ที่คุณชอบ) ตัวอย่างของอัลกอริทึม Metropolis-Hastings โดยใช้การแจกแจงข้อเสนอที่ไม่สมมาตร?qρ(x,y)=min(f(y)/f(x),1)f(y)/f(x)

1
ฉันเพิ่งจำโพสต์บล็อกที่ยอดเยี่ยมเกี่ยวกับปัญหาที่เกี่ยวข้องอาจช่วย: darrenjw.wordpress.com/2012/06/04/…
joint_p

คำตอบ:


20

บรรณานุกรมระบุว่าหาก 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คำนวณ)


คำตอบที่ยอดเยี่ยม! ขอบคุณมาก! ในกรณีของฉันฉันมีรูปแบบพารามิเตอร์ 6-7 และฉันไม่รู้ว่าการกระจายด้านหลังอาจมีลักษณะอย่างไร (แต่อาจเป็น bimodal) เนื่องจากชุดข้อมูลของฉันบางครั้งแตกต่างกันโดยสิ้นเชิง ตามสิ่งที่คุณพูดฉันสามารถใช้ Metropolis (-Hastings) โดยใช้ความแปรปรวนจำนวนมากในการกระจายข้อเสนอหรือใช้ Random Walk Metropolis (-Hastings) ด้วยความแปรปรวนที่น้อยลงในการกระจายข้อเสนอ ไม่ว่าในกรณีพิเศษใดทางออกที่สองควรมาบรรจบกันได้เร็วขึ้นกับการกระจายเป้าหมาย ขวา?
AstrOne

ตอนนี้เกี่ยวข้องกับรหัส Metropolis-Hastings ฉันคิดว่าจะแทนที่R=exp(logR)ด้วยสิ่งนี้: R=exp(logR)*(dnorm(y[t-1],y.prop,my_sigma)/dnorm(y.prop,y[t-1],my_sigma))สำหรับการเดินแบบสุ่มและไม่ใช่การสุ่ม MH ถูกต้องหรือไม่
AstrOne

1
โดยทั่วไป แต่อย่างที่ฉันพูดถึงในรหัสเมือง: คุณต้องการคำนวณของคุณในพื้นที่บันทึก การคำนวณความน่าจะมีแนวโน้มที่จะทำงานกับค่าที่น้อยมากดังนั้นโดยทั่วไปคุณจะได้ผลลัพธ์ที่ดีกว่ามากโดยเพิ่มลอการิทึมและอธิบายผลลัพธ์ของคุณมากกว่าการคูณค่าดิบเข้าด้วยกัน
David Marx

1
คุณไม่จำเป็นต้องกังวลเกี่ยวกับสถานะปัจจุบันของห่วงโซ่ (เช่น ) เมื่อคุณใช้การแจกแจงข้อเสนอคงที่เพราะ: . การกระจายข้อเสนอคงที่สร้างข้อเสนอที่เป็นอิสระ เราคำนึงถึงในอัตราส่วนมหานคร yt1q(yt|yt1)=q(yt)yt1
David Marx

1
คุณระบุว่า "ในอัลกอริธึมการเดินที่ไม่ใช่แบบสุ่มการแจกแจงข้อเสนอจะได้รับการแก้ไขในชุดการเดินแบบสุ่มศูนย์กลางของการกระจายข้อเสนอจะเปลี่ยนในแต่ละการวนซ้ำ" ซึ่งไม่ถูกต้อง รุ่น MH ที่ไม่ใช่การเดินแบบสุ่มส่วนใหญ่มีข้อเสนอที่ขึ้นอยู่กับสถานะปัจจุบันของลูกโซ่มาร์คอฟซึ่งบางครั้งก็อยู่ที่สถานะนี้ ตัวอย่างที่สำคัญคืออัลกอริทึม Langevin MCMC เมื่อข้อเสนอได้รับการแก้ไขนี้เป็นขั้นตอนวิธีการ MH อิสระ
ซีอาน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.