গ্রন্থপত্রে বলা হয়েছে যে, যদি q একটি প্রতিসম বিতরণ হয় তবে অনুপাত q (x | y) / q (y | x) 1 হয়ে যায় এবং অ্যালগরিদমকে মেট্রোপলিস বলে। এটা কি ঠিক?
হ্যাঁ, এটি সঠিক। মেট্রোপলিস অ্যালগরিদম এমএইচ অ্যালগরিদমের একটি বিশেষ ক্ষেত্রে।
"র্যান্ডম ওয়াক" মহানগর (-হ্যাস্টিংস) সম্পর্কে কী? এটি অন্য দুটি থেকে কীভাবে আলাদা?
একটি এলোমেলো পদচারণায়, প্রস্তাব বিতরণটি চেইনের দ্বারা সর্বশেষে উত্পাদিত মূল্যে প্রতিটি পদক্ষেপের পরে পুনরায় কেন্দ্রীভূত হয়। সাধারণত, এলোমেলো পদব্রজে প্রস্তাব বিতরণ গাউসিয়ান হয়, সেক্ষেত্রে এই এলোমেলো হাঁটা প্রতিসামতার প্রয়োজনীয়তা পূরণ করে এবং অ্যালগরিদম মহানগর হয়। আমি মনে করি আপনি একটি অসমমিতিক বিতরণ দিয়ে একটি "ছদ্ম" র্যান্ডম ওয়াক করতে পারবেন যা প্রস্তাবগুলি স্কুয়ের বিপরীত দিকে খুব চালিত হতে পারে (একটি বাম স্কিউ বিতরণ ডানদিকে প্রস্তাবগুলির পক্ষে হবে)। আপনি কেন এটি করবেন তা আমি নিশ্চিত নই, তবে আপনি এটি করতে পারেন এবং এটি একটি মহানগর হেসিংস অ্যালগরিদম হতে পারে (অর্থাত্ অতিরিক্ত অনুপাতের মেয়াদ প্রয়োজন)।
এটি অন্য দুটি থেকে কীভাবে আলাদা?
একটি নন-র্যান্ডম ওয়াক অ্যালগরিদমে, প্রস্তাব বিতরণগুলি স্থির হয়। এলোমেলো হাঁটার বৈকল্পিকের ক্ষেত্রে, প্রস্তাবনা বিতরণের কেন্দ্রটি প্রতিটি পুনরাবৃত্তিতে পরিবর্তিত হয়।
যদি প্রস্তাব বিতরণটি পয়সন বিতরণ হয়?
তারপরে আপনাকে কেবল মহানগরের পরিবর্তে এমএইচ ব্যবহার করতে হবে। সম্ভবত এটি একটি পৃথক বিতরণ নমুনা হিসাবে অন্যথায় আপনি আপনার প্রস্তাব উত্পন্ন করতে একটি স্বতন্ত্র ফাংশন ব্যবহার করতে চান না।
যে কোনও ইভেন্টে, যদি স্যাম্পলিং বিতরণটি কেটে ফেলা হয় বা এর স্কিউ সম্পর্কে আপনার পূর্ববর্তী জ্ঞান থাকে, আপনি সম্ভবত একটি অসামান্য নমুনা বিতরণ ব্যবহার করতে চান এবং অতএব মহানগর-হ্যাসিং ব্যবহার করা প্রয়োজন।
কেউ কি আমাকে একটি সাধারণ কোড (সি, পাইথন, আর, সিউডো কোড বা আপনি যা পছন্দ করেন) উদাহরণ দিতে পারেন?
এখানে মহানগরী:
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
)।
আমি পরে মহানগর হ্যাসিংয়ের উদাহরণ সহ আপডেট করার চেষ্টা করব। একটি মহানগর হ্যাসিংস অ্যালগরিদম উত্পাদন করার জন্য উপরের কোডটি কীভাবে পরিবর্তন করতে হবে তা আপনি মোটামুটি সহজেই দেখতে সক্ষম হবেন (ইঙ্গিত: আপনাকে কেবল logR
গণনায় পরিপূরক অনুপাত যুক্ত করতে হবে )।