বার্ট্র্যান্ডের বক্স প্যারাডক্সের একটি মন্টি কার্লো সিমুলেশন কীভাবে প্রোগ্রাম করবেন?


12

নিম্নলিখিত সমস্যাটি মেনসা আন্তর্জাতিক ফেসবুক পৃষ্ঠায় পোস্ট করা হয়েছে:

এখানে চিত্র বর্ণনা লিখুন

পোস্টটি নিজেই 1000+ টি মন্তব্য পেয়েছে তবে আমি সেখানে বিতর্ক সম্পর্কে বিশদে যাব না কারণ আমি জানি এটি বার্ট্র্যান্ডের বাক্স প্যারাডক্স এবং উত্তরটি হ'ল । আমাকে কী এখানে আগ্রহী করে তুলেছে তা হল একজন মন্টি কার্লো পদ্ধতির সাহায্যে এই সমস্যার উত্তর কীভাবে দেয়? এই সমস্যাটি সমাধান করার জন্য অ্যালগরিদম কীভাবে হয়?23

এখানে আমার প্রচেষ্টা:

  1. সমানভাবে বিতরণ করে এবং মধ্যে এলোমেলো সংখ্যাগুলি জেনারেট করুন ।0 1এন01
  2. বাক্সের ইভেন্টে 2 টি সোনার বল (1 বাক্স 1) নির্বাচিত হওয়া অর্ধেকেরও কম হওয়া যাক।
  3. চেয়ে কম নম্বর গণনা করুন এবং ফলাফলকে হিসাবে কল করুন ।এস0.5এস
  4. যেহেতু 1 বাক্সটি নির্বাচন করা হয় তা সোনার বল পাওয়ার একটি নিশ্চয়তা এবং বাক্স 2 নির্বাচন করা হলে সোনার বল পাওয়ার এটি কেবল 50% সম্ভাবনা, সুতরাং সিকোয়েন্স জিজি পাওয়ার সম্ভাবনা হ'ল
    পি(বি2=জি|বি1=জি)=এসএস+ +0.5(এন-এস)

আর-তে উপরের অ্যালগরিদম বাস্তবায়ন:

N <- 10000
S <- sum(runif(N)<0.5)
S/(S+0.5*(N-S))

উপরের প্রোগ্রামটির আউটপুট কাছাকাছি যা প্রায় সঠিক উত্তরটির সাথে মিলছে তবে আমি নিশ্চিত নই যে এটি সঠিক উপায়। প্রোগ্রামটিমে সমস্যা সমাধানের কোন সঠিক উপায় আছে কি?0.67

উত্তর:


14

@ হেনরির মতো , আমি সত্যিই অনুভব করি না যে আপনার সমাধানটি মন্টি কার্লো। অবশ্যই, আপনি বিতরণ থেকে নমুনা করেছেন, তবে ডেটা উত্পন্নকরণের প্রক্রিয়াটি অনুকরণ করার সাথে এর তেমন কিছু করার নেই। যদি আপনি কাউকে তাত্ত্বিক সমাধানটি সঠিক বলে বোঝাতে মন্টি কার্লো ব্যবহার করতে চান, আপনার ডেটা তৈরির প্রক্রিয়া অনুকরণ করে এমন সমাধান ব্যবহার করতে হবে। আমি এটি নীচের মত কিছু হতে পারে কল্পনা:

boxes <- list(
  c(0, 0),
  c(0, 1),
  c(1, 1)
)

count_successes = 0
count_valid_samples = 0

for (i in 1:5000) {
  sampled_box <- unlist(sample(boxes, 1)) # sample box
  sampled_balls <- sample(sampled_box)    # shuffle balls in the box

  if (sampled_balls[1] == 1) {            # if first ball is golden
    if (sampled_balls[2] == 1) {          # if second ball is golden
      count_successes = count_successes + 1
    }
    count_valid_samples = count_valid_samples + 1
  }
}
count_successes / count_valid_samples

বা "ভেক্টরাইজড" কোড ব্যবহার করে:

mean(replicate(5000, {       # repeat 5000 times, next calculate empirical probability
  x <- boxes[[sample(3, 1)]] # pick a box
  if (x[sample(2, 1)] == 1)  # pick a ball, check if it is golden
    return(sum(x) == 2)      # check if you have two golden balls in the box
  else
    return(NA)               # ignore if sampled ball is silver
  }), na.rm = TRUE)          # not count if silver

লক্ষ করুন যে যেহেতু আপনার প্রথম অবস্থাটি ইতিমধ্যে আঁকা ছিল এবং এটি সোনার রঙের শর্তের, সুতরাং উপরের কোডটি কেবল দুটি বাক্স ব্যবহার করতে পারে boxes <- list(c(0, 1), c(1, 1))এবং সেগুলি থেকে নমুনা তৈরি x <- boxes[[sample(2, 1)]]করতে পারে, সুতরাং কোডটি আরও দ্রুত হবে যেহেতু এটি 1/3 তৈরি করে না আমরা ছাড় যে খালি রান। তবে যেহেতু সমস্যাটি সহজ এবং কোডটি দ্রুত চলে তাই আমরা সঠিকভাবে ফলাফলটি সঠিক তা নিশ্চিত হওয়ার জন্য "নিশ্চিত হতে" পুরো ডেটা তৈরির প্রক্রিয়াটি পরিষ্কারভাবে অনুকরণ করতে পারি afford তদ্ব্যতীত, এই পদক্ষেপের প্রয়োজন হয় না কারণ এটি উভয় ক্ষেত্রেই একই ফলাফল দেয় yield


এর x <- boxes[[sample(3, 1)]]অর্থ কি আপনি 3 বাক্স থেকে একটি বাক্স নিয়েছেন? যদি তা হয় তবে আপনি কেন ইতিমধ্যে একটি সোনার বল বাছাই করেছেন তা আমরা জানার পরে কেন এটি প্রয়োজনীয়?
আনাস্তাসিয়া-রোমানোভা

7
@ আনাস্তাসিয়া-রোমানোভা instead আপনি তার পরিবর্তে দুটি বাক্স থেকে নমুনা নিতে পারেন boxes <- list(c(0, 1), c(1, 1))এবং তারপরেও x <- boxes[[sample(2, 1)]], যেহেতু এটি প্রায় একই গণনার সময়, তাই কেন নমুনা প্রক্রিয়াটির অনুরূপ অতিরিক্ত পদক্ষেপটি ব্যবহার করবেন না? এটি ফলাফল সম্পর্কে কোনও পরিবর্তন করে না, তবে সিমুলেশনটিকে সুস্পষ্ট করে তোলে।
টিম

ঠিক আছে টিম, আপনার উত্তরের জন্য ধন্যবাদ। আমি আরে মোটামুটি নতুন থাকায় আপনার উত্তরটি বুঝতে প্রথমে আমাকে সময় দিন now আপাতত আপনার ও @ হেনরির জন্য +1 করুন।
আনস্তাসিয়া-রোমানোভা 秀

1
@ আনাস্তাসিয়া-রোমানোভা 秀 হ্যাঁ, ঠিক। কোডটি একটি বাক্সকে নমুনা দেয়, তারপরে বাক্স থেকে একটি বল নমুনা করে, যদি এটি সোনার হয় (= 1) তবে এটি পরীক্ষা করে যে বাক্সের অন্যান্য বলটিও সোনার (1 + 1 = 2), যদি হ্যাঁ হয় তবে এটি এটি গণনা করে এবং শেষ পর্যন্ত এটি মোট গণনা (যেমন ব্যবহার mean) দ্বারা যোগফলকে ভাগ করে ides
টিম

1
@ আনাস্তাসিয়া-রোমানোভা return(NA)missing অনুপস্থিত মান ফিরিয়ে দেয় এবং তারপরে mean(, na.rm = TRUE)ব্যবহার করা হয়, যেখানে na.rm = TRUEযুক্তিটি অনুপস্থিত মানগুলিকে উপেক্ষা করার জন্য ফাংশনটিকে বলে। অন্যান্য প্রোগ্রামিং ভাষায় এটি ভিন্নভাবে করা যেতে পারে, উদাহরণস্বরূপ ব্যবহার continueবা passকীওয়ার্ড।
টিম

4

আমি মনে করি আপনার S/(S+0.5*(N-S))গণনা আসলেই সিমুলেশন নয়

এরকম কিছু চেষ্টা করুন

N <- 10^6
ballsinboxes <- c("G","G", "G","S", "S","S")
selectedbox <- sample(c(1,2,3), N, replace=TRUE)
selectedball <- sample(c(1,2), N, replace=TRUE)
selectedcolour <- ballsinboxes[(selectedbox-1)*2 + selectedball ]
othercolour <- ballsinboxes[(selectedbox-1)*2 + 3 - selectedball ]
sum(selectedcolour == "G" & othercolour == "G") / sum(selectedcolour == "G")

-2

কেন কেবল মামলাগুলি তালিকাভুক্ত করবেন না?

এখানে: জি "সোনার" জন্য, এস "রৌপ্য" এর জন্য, মূলধন প্রাথমিক নিষ্কাশনের জন্য:

GG

GG

GS

... অন্য সমস্ত ক্ষেত্রে প্রাথমিক রৌপ্য (এস) নিষ্কাশন চালানো হয় এবং শর্তসাপেক্ষে (প্রাথমিক নিষ্কাশন জি) সন্তুষ্ট হয় না।

এমনি, পি (জি | জি) = 2/3।


7
প্রশ্নটি মন্টি কার্লো সমাধান সম্পর্কে জিজ্ঞাসা করে।
টিম

ঠিক আছে, সমস্ত সম্ভাবনার তালিকা করা মন্টি কার্লোর চরম ঘটনা।
ghuezt

4
না এটি নয়, মন্টি কার্লো সিমুলেশন / র্যান্ডমাইজেশন সম্পর্কে।
টিম

টিম, আপনার গণিত ঠিক আছে। অসীম অনেকগুলি অঙ্কন সহ, আপনি সমান সম্ভাবনাযুক্ত সমস্ত ক্ষেত্রে হুবহু একটি তালিকা পাবেন। আমি দু: খিত "চরম কেস" এবং সীমাবদ্ধতার অর্থ।
ghuezt

1
অবশ্যই, তবে সমস্ত ক্ষেত্রে তালিকাবদ্ধ করা মন্টি কার্লো নয়। স্কোয়ার একটি আয়তক্ষেত্র, তবে আয়তক্ষেত্রটি বর্গক্ষেত্র নয়।
টিম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.