असममित प्रस्ताव वितरण के साथ मेट्रोपोलिस-हेस्टिंग्स को समझना


14

मैं एक मॉडल के मापदंडों का आकलन करने के लिए एक कोड लिखने के लिए मेट्रोपोलिस-हेस्टिंग्स एल्गोरिथ्म को समझने की कोशिश कर रहा हूं (यानी )। मेट्रोपोलिस-हेस्टिंग्स एल्गोरिथ्म की ग्रंथ सूची के अनुसार निम्नलिखित चरण हैं: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)

मैं कुछ प्रश्न कैसे पूछना चाहूंगा:

  • ग्रंथ सूची में कहा गया है कि यदि q एक सममित वितरण है तो q (x | y) / q (y; x) का अनुपात q(x|y)/q(y|x)1 हो जाता है और एल्गोरिथम को मेट्रोपोलिस कहा जाता है। क्या वो सही है? मेट्रोपोलिस और मेट्रोपोलिस-हेस्टिंग्स के बीच एकमात्र अंतर यह है कि पहले एक सममित वितरण का उपयोग करता है? "रैंडम वॉक" के बारे में महानगर (-हस्टिंग्स) क्या है? यह अन्य दो से कैसे भिन्न है?
  • उदाहरण का अधिकांश कोड जो मुझे ऑन-लाइन मिलता है वह एक गाऊसी प्रस्ताव वितरण q का उपयोग करता है qऔर इस प्रकार ρ(x,y)=min(f(y)/f(x),1) जहां f(y)/f(x) संभावना अनुपात है। क्या होगा यदि प्रस्ताव वितरण एक पॉसों वितरण है? मुझे लगता है कि मैं तर्कसंगत रूप से समझता हूं कि एक असममित वितरण का उपयोग करते समय वह अनुपात 1 क्यों नहीं बन जाता है लेकिन मुझे यकीन नहीं है कि अगर यह गणितीय रूप से या कोड के साथ इसे कैसे लागू किया जाए। क्या कोई मुझे गैर-सममित प्रस्ताव वितरण का उपयोग करके मेट्रोपोलिस-हेस्टिंग्स एल्गोरिथ्म का एक सरल कोड (सी, अजगर, आर, छद्म कोड या जो कुछ भी आप पसंद करते हैं) दे सकता है?

1
मैंने सिर्फ एक संबंधित मुद्दे पर एक उत्कृष्ट ब्लॉग पोस्ट को याद किया, शायद इससे मदद मिलती है: darrenjw.wordpress.com/2012/06/04/…
joint_p

जवाबों:


20

ग्रंथ सूची में कहा गया है कि यदि q एक सममित वितरण है तो q (x | y) / q (y; x) का अनुपात 1 हो जाता है और एल्गोरिथम को मेट्रोपोलिस कहा जाता है। क्या वो सही है?

हां यह सही है। मेट्रोपोलिस एल्गोरिथ्म एमएच एल्गोरिथ्म का एक विशेष मामला है।

"रैंडम वॉक" के बारे में महानगर (-हस्टिंग्स) क्या है? यह अन्य दो से कैसे भिन्न है?

रैंडम वॉक में, चेन द्वारा उत्पन्न अंतिम मूल्य पर प्रत्येक चरण के बाद प्रस्ताव वितरण फिर से केंद्रित होता है। आम तौर पर, एक यादृच्छिक चाल में प्रस्ताव वितरण गॉसियन होता है, जिस स्थिति में यह यादृच्छिक चलना समरूपता की आवश्यकता को पूरा करता है और एल्गोरिथ्म महानगर है। मुझे लगता है कि आप एक असममित वितरण के साथ "छद्म" यादृच्छिक प्रदर्शन कर सकते हैं जो कि तिरछी दिशा के विपरीत दिशा में बहुत अधिक बहाव का कारण बनेगा (एक बाईं तिरछी वितरण दाईं ओर प्रस्तावों का पक्ष लेगी)। मुझे यकीन नहीं है कि आप ऐसा क्यों करेंगे, लेकिन आप कर सकते हैं और यह एक महानगर हेस्टिंग्स एल्गोरिथम होगा (अर्थात अतिरिक्त अनुपात अवधि की आवश्यकता है)।

यह अन्य दो से कैसे भिन्न है?

एक गैर-यादृच्छिक वॉक एल्गोरिथ्म में, प्रस्ताव वितरण तय होते हैं। रैंडम वॉक वेरिएंट में, प्रत्येक वितरण में प्रस्ताव वितरण का केंद्र बदलता है।

क्या होगा यदि प्रस्ताव वितरण एक पॉसों वितरण है?

फिर आपको सिर्फ महानगर के बजाय एमएच का उपयोग करने की आवश्यकता है। संभवतः यह एक असतत वितरण का नमूना होगा, अन्यथा आप अपने प्रस्तावों को बनाने के लिए असतत फ़ंक्शन का उपयोग नहीं करना चाहेंगे।

किसी भी घटना में, यदि नमूना वितरण को काट दिया जाता है या आपको इसके तिरछा होने का पूर्व ज्ञान होता है, तो आप शायद एक असममित नमूना वितरण का उपयोग करना चाहते हैं और इसलिए इसे मेट्रोपोलिस-हेस्टिंग्स का उपयोग करने की आवश्यकता है।

क्या कोई मुझे एक सरल कोड दे सकता है (C, अजगर, R, छद्म कोड या जो आप पसंद करते हैं) उदाहरण?

यहाँ महानगर है:

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

आइए एक बिमोडल वितरण के नमूने के लिए इसका उपयोग करने का प्रयास करें। पहले, आइए देखें कि क्या होता है अगर हम अपने प्रॉस्पेक्टल के लिए एक यादृच्छिक चलने का उपयोग करते हैं:

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

मैं बाद में महानगर hastings के एक उदाहरण के साथ अद्यतन करने की कोशिश करेंगे। आपको एक मेट्रोपोलिस हेस्टिंग्स एल्गोरिथ्म का उत्पादन करने के लिए उपरोक्त कोड को संशोधित करने का तरीका आसानी से देखने में सक्षम होना चाहिए (संकेत: आपको logRगणना में पूरक अनुपात जोड़ने की आवश्यकता है )।


बहुत बढ़िया जवाब! आपको बहुत - बहुत धन्यवाद! मेरे मामले में मेरे पास 6-7 पैरामीटर मॉडल है और मुझे पता नहीं है कि पीछे का वितरण कैसा दिख सकता है (लेकिन यह बायोमॉडल हो सकता है) क्योंकि मेरे डेटासेट कभी-कभी पूरी तरह से अलग होते हैं। आपने जो कहा उसके आधार पर मैं या तो मेट्रोपोलिस (-हैस्टिंग्स) का उपयोग प्रस्ताव वितरण में एक विशाल विचरण का उपयोग कर कर सकता हूं या प्रस्ताव वितरण में एक छोटे से विचरण के साथ रैंडम वॉक मेट्रोपोलिस (-हैस्टिंग्स) का उपयोग कर सकता हूं। किसी विशेष परिस्थिति में दूसरे समाधान को तेजी से लक्ष्य वितरण में परिवर्तित नहीं करना चाहिए। सही?
AstrOne

अब मेट्रोपोलिस-हेस्टिंग्स कोड से संबंधित मैं इसके 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
मूल रूप से, लेकिन जैसा कि मैंने महानगर कोड में उल्लेख किया है: आप अपनी गणना लॉग स्पेस में करना चाहते हैं। संभावना की गणना बहुत छोटे मूल्यों पर संचालित होती है, इसलिए आप आमतौर पर लॉगरिदम को जोड़ने और कच्चे मूल्यों को एक साथ गुणा करने की तुलना में अपने परिणामों को उजागर करने के लिए बेहतर परिणाम प्राप्त करते हैं।
डेविड मार्क्स

1
जब आप एक निश्चित प्रस्ताव वितरण का उपयोग कर रहे हों तो आपको श्रृंखला की वर्तमान स्थिति (यानी ) के बारे में चिंता करने की आवश्यकता नहीं है क्योंकि: । एक निश्चित प्रस्ताव वितरण स्वतंत्र प्रस्ताव उत्पन्न करता है। हम महानगर अनुपात में खाते में लेते हैं । yt1q(yt|yt1)=q(yt)yt1
डेविड मार्क्स

1
आप कहते हैं "एक गैर-यादृच्छिक वॉक एल्गोरिथ्म में, प्रस्ताव वितरण तय किए जाते हैं। यादृच्छिक वॉक वैरिएंट में, प्रत्येक पुनरावृत्ति पर प्रस्ताव वितरण का केंद्र बदलता है" जो सही नहीं है। MH संस्करण जो यादृच्छिक रूप से नहीं चलते हैं उनमें ज्यादातर प्रस्ताव होते हैं जो मार्कोव श्रृंखला की वर्तमान स्थिति पर निर्भर करते हैं, कभी-कभी इस राज्य में भी केंद्रित होते हैं। एक प्रमुख उदाहरण Langevin MCMC एल्गोरिथ्म है। जब प्रस्ताव तय हो जाता है, तो यह एक स्वतंत्र एमएच एल्गोरिदम है
शीआन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.