Bertrand'ın kutu paradoksunun Monte Carlo simülasyonu nasıl programlanır?


12

Mensa Uluslararası Facebook Sayfasına aşağıdaki sorun gönderildi:

resim açıklamasını buraya girin

Gönderinin kendisi 1000+ yorum aldı, ancak Bertrand'ın kutu paradoksu olduğunu ve cevabın 2 olduğunu bildiğim için orada tartışma hakkında ayrıntılara girmeyeceğim. . Beni burada ilgilendiren şey Monte Carlo yaklaşımını kullanarak bu soruna nasıl cevap veriyor? Bu sorunu çözmek için algoritma nasıl?23

İşte benim girişimim:

  1. 0 ile 1 arasında eşit dağılmış rasgele sayı üret .N01
  2. Kutunun olayı seçili 2 altın top (kutu 1) yarıdan az olsun.
  3. 0.5S
  4. P(B2=G|B1=G)=SS+0.5(NS)

Yukarıdaki algoritmayı R'de uygulamak:

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

0.67

Yanıtlar:


14

Gibi @Henry , gerçekten çözüm bir Monte Carlo olduğunu hissetmiyorum. Elbette, dağıtımdan örnek alırsınız, ancak veri oluşturma sürecini taklit etmekle ilgisi yoktur. Birini teorik çözümün doğru olduğuna ikna etmek için Monte Carlo kullanmak istiyorsanız, veri oluşturma sürecini taklit eden bir çözüm kullanmanız gerekir. Aşağıdaki gibi bir şey olduğunu hayal ediyorum:

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

veya "vectorized" kodunu kullanarak:

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

İlk topun zaten çizilmiş ve altın olduğu gerçeğini koşullandırdığınıza dikkat edin, bu nedenle yukarıdaki kod sadece iki kutu kullanabilir boxes <- list(c(0, 1), c(1, 1))ve onlardan örnek alabilir x <- boxes[[sample(2, 1)]], bu nedenle kod 1/3 yapmaz çünkü daha hızlı olurdu indirim yaptığımız boş koşular. Ancak sorun basit olduğundan ve kod hızlı çalıştığından, sonucun doğru olduğundan emin olmak için tüm veri oluşturma sürecini açıkça "taklit edebiliriz". Bunun yanında, her iki durumda da aynı sonuçları vereceği için bu adıma gerek yoktur.


x <- boxes[[sample(3, 1)]]3 kutudan bir kutu aldığınız anlamına mı geliyor? Eğer öyleyse, zaten bir altın top aldığını bildiğimiz için neden gerekli?
Anastasiya-Romanova 秀

7
@ Anastasiya-Romanova秀yapabildin iki kutularından yerine numune boxes <- list(c(0, 1), c(1, 1))ardından ve x <- boxes[[sample(2, 1)]]ancak bu hemen hemen aynı hesaplama zamanı olduğundan, neden tam örnekleme sürecini andıran o ekstra adımı kullanılmasın? Sonuçla ilgili hiçbir şeyi değiştirmez, ancak simülasyonu açık hale getirir.
Tim

Tamam Tim, cevabın için teşekkürler. R'de epeyce yeni olduğum için ilk önce cevabını anlamama zaman ver. Şimdilik +1 senin için & @Henry.
Anastasiya-Romanova 秀

1
@ Anastasiya-Romanova 秀 evet, kesinlikle. Kod bir kutu örnekliyor, sonra kutudan bir top örnekliyor, eğer altın (= 1) ise, kutudaki diğer topun da altın (1 + 1 = 2) olup olmadığını kontrol eder, eğer evetse sayar ve sonunda toplamı toplam sayıya böler (yani kullanır mean).
Tim

1
@ Anastasiya-Romanova return(NA)missing eksik değeri döndürür ve sonra mean(, na.rm = TRUE)kullanılır, burada na.rm = TRUEargüman işleve eksik değerleri yoksaymasını söyler. Diğer programlama dillerinde bu farklı şekilde yapılabilir, örneğin continueveya passanahtar kelimeler.
Tim

4

S/(S+0.5*(N-S))Hesaplamanızın gerçekten simülasyon olmadığını hissediyorum

Böyle bir şey dene

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

Neden sadece vakaları listelemiyoruz?

Burada: G "altın", S "gümüş", sermaye ilk çıkarım içindir:

İyi oyun

İyi oyun

Gs

... diğer tüm durumlar bir ilk gümüş (S) ekstraksiyonunu faturalandırır ve koşullu (ilk ekstraksiyon G) karşılanmaz.

Böyle, P (g | G) = 2/3.


7
Soru Monte Carlo çözümünü soruyor.
Tim

TÜM olasılıkları listelemek, Monte Carlo'nun aşırı bir örneğidir.
ghuezt

4
Hayır değil, Monte Carlo simülasyon / randomizasyon ile ilgili.
Tim

Tim, matematiğini doğru yap. Sonsuz sayıda çekiliş ile, eşit olasılıklara sahip tüm vakaların tam bir listesini alırsınız. Üzgün ​​"aşırı dava" ve demek istediğim sınır.
ghuezt

1
Elbette, ancak tüm vakaları listelemek Monte Carlo değildir. Kare bir dikdörtgen, ancak dikdörtgen bir kare değil.
Tim
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.