बर्ट्रेंड के बॉक्स विरोधाभास के एक मोंटे कार्लो सिमुलेशन कैसे प्रोग्राम करें?


12

निम्नलिखित समस्या मेंसा इंटरनेशनल फेसबुक पेज पर पोस्ट की गई है:

यहाँ छवि विवरण दर्ज करें

पोस्ट को स्वयं 1000+ टिप्पणियाँ मिलीं, लेकिन मैं बहस के बारे में तब तक नहीं जाऊँगा, क्योंकि मुझे पता है कि यह बर्ट्रेंड का बॉक्स विरोधाभास है और इसका उत्तर । मुझे यहाँ क्या दिलचस्पी है कि एक मोंटे कार्लो दृष्टिकोण का उपयोग करके इस समस्या का जवाब कैसे देता है? इस समस्या को हल करने के लिए एल्गोरिदम कैसे है?23

यहाँ मेरा प्रयास है:

  1. उत्पन्न समान रूप से के बीच यादृच्छिक संख्या वितरित 0 और 1N01
  2. बता दें कि बॉक्स की घटना में 2 गोल्ड बॉल्स (बॉक्स 1) का चयन किया गया है जो आधे से कम है।
  3. संख्या को से कम पर गिनें और परिणाम को एस कहें ।0.5S
  4. चूंकि बॉक्स 1 का चयन होने पर स्वर्ण गेंद प्राप्त करना निश्चित है और यदि बॉक्स 2 का चयन किया जाता है, तो स्वर्ण गेंद मिलने की केवल 50% संभावना है, इसलिए अनुक्रम GG होने की संभावना
    P(B2=G|B1=G)=SS+0.5(NS)

आर में ऊपर एल्गोरिथ्म को लागू करना:

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 नहीं होगा खाली चलता है कि हम छूट। हालाँकि जब से समस्या सरल है और कोड तेजी से चलता है, हम स्पष्ट रूप से पूरे डेटा जनरेट करने की प्रक्रिया को "सुनिश्चित करने के लिए" का परिणाम दे सकते हैं कि परिणाम सही है। इसके अलावा, इस कदम की जरूरत नहीं है क्योंकि यह दोनों मामलों में समान परिणाम देगा।


क्या x <- boxes[[sample(3, 1)]]आप 3 बक्से से एक बॉक्स लेते हैं? यदि हां, तो यह आवश्यक क्यों है क्योंकि हम जानते हैं कि आप पहले से ही एक सोने की गेंद उठा चुके हैं?
अनास्तासिया-रोमानोवा

7
@ अनास्तासिया-रोमानोवा as आप दो बक्सों से नमूना ले सकते हैं boxes <- list(c(0, 1), c(1, 1))और फिर x <- boxes[[sample(2, 1)]], लेकिन चूंकि यह लगभग एक ही गणना समय है, इसलिए अतिरिक्त कदम का उपयोग क्यों न करें जो वास्तव में नमूना प्रक्रिया जैसा दिखता है? यह परिणाम के बारे में कुछ भी नहीं बदलता है, लेकिन अनुकरण को स्पष्ट करता है।
टिम

ठीक है टिम, आपके उत्तर के लिए धन्यवाद। मुझे अपना उत्तर समझने के लिए पहले समय दें क्योंकि मैं आर। में अभी काफी नया हूं, आपके और @ हेनरी के लिए +1।
अनस्तासिया-रोमानोवा

1
@ अनास्तासिया-रोमानोवा Roman हाँ, बिल्कुल। कोड एक बॉक्स का नमूना लेता है, फिर बॉक्स से एक गेंद का नमूना लेता है, अगर यह सुनहरा है (= 1) तो यह जांचता है कि क्या बॉक्स से दूसरी गेंद भी सुनहरी है (1 + 1 = 2), यदि हाँ तो यह इसे गिनता है और अंत में यह योग को कुल गणना (यानी उपयोग mean) से विभाजित करता है ।
टिम

1
@ अनास्तासिया-रोमानोवा return(NA)value लापता मान लौटाता है और फिर 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

बस मामलों की सूची क्यों नहीं?

यहाँ: G "सोने" के लिए है, S "चांदी" के लिए है, पूंजी प्रारंभिक निष्कर्षण के लिए है:

gg

GG

जी

... अन्य सभी मामले एक प्रारंभिक चांदी (एस) निष्कर्षण को लागू करते हैं और सशर्त (प्रारंभिक निष्कर्षण जी) को संतुष्ट नहीं करते हैं।

ऐसे, पी (जी | जी) = 2/3।


7
सवाल मोंटे कार्लो समाधान के बारे में पूछता है।
टिम

खैर, सभी संभावनाओं को सूचीबद्ध करना मोंटे कार्लो का एक चरम मामला है।
घूंटेक्ट

4
नहीं, यह नहीं है, मोंटे कार्लो सिमुलेशन / यादृच्छिककरण के बारे में है।
टिम

टिम, अपने गणित सही हो जाओ। असीम रूप से कई ड्रा के साथ, आपको समान संभावनाओं वाले सभी मामलों की सूची मिलती है। मैं दुखी "चरम मामले" और सीमा का मतलब है।
घुत्से १५

1
ज़रूर, लेकिन सभी मामलों को सूचीबद्ध करना मोंटे कार्लो नहीं है। स्क्वायर एक आयत है, लेकिन आयत एक वर्ग नहीं है।
टिम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.