ग्रंथ सूची में कहा गया है कि यदि 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
गणना में पूरक अनुपात जोड़ने की आवश्यकता है )।