バートランドのボックスパラドックスのモンテカルロシミュレーションをプログラムする方法は?


12

次の問題がメンサインターナショナルのFacebookページに投稿されました。

ここに画像の説明を入力してください

投稿自体には1000件以上のコメントが寄せられましたが、ここでの議論については詳しく説明しません。これはバートランドの箱のパラドックスであり、答えは。ここで私が興味を持っているのは、モンテカルロ法を使用してこの問題にどのように答えるかです。この問題を解決するアルゴリズムはどのようになっていますか?23

私の試みは次のとおりです。

  1. 0から1までの均一に分布した乱数を生成します。N01
  2. ボックスのイベントに、半分未満に選択された2つの金のボール(ボックス1)が含まれているとします。
  3. 未満の数値をカウントし、結果をSとして呼び出します。0.5S
  4. ボックス1が選択されている場合はゴールドボールを取得するのは確実であり、ボックス2が選択されている場合はゴールドボールを取得する可能性は50%だけなので、シーケンスGGを取得する確率は
    PB2=G|B1=G=SS+0.5NS

Rで上記のアルゴリズムを実装する:

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

0.67

回答:


14

同様@Henry、私は本当にあなたのソリューションは、モンテカルロであることを感じることはありません。確かに、ディストリビューションからサンプリングしますが、データ生成プロセスを模倣することとはあまり関係がありません。モンテカルロを使用して、理論的な解決策が正しいことを誰かに納得させたい場合は、データ生成プロセスを模倣する解決策を使用する必要があります。私はそれが以下のようなものになると想像します:

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

最初のボールがすでに描かれ、それが黄金色であるという事実を条件としているため、上記のコードは単純に2つのボックスboxes <- list(c(0, 1), c(1, 1))を使用しx <- boxes[[sample(2, 1)]]、それらからサンプリングできるため、コードは1/3にならないため高速になります割引する空のラン。ただし、問題は単純で、コードは高速で実行されるため、データ生成プロセス全体を明示的にシミュレートして、結果が正しいことを「確認」する余裕があります。それに加えて、両方のケースで同じ結果が得られるため、この手順は必要ありません。


あなたx <- boxes[[sample(3, 1)]]は3つの箱から箱を取ることを意味しますか?もしそうなら、なぜあなたはすでに金のボールを選んだことがわかっているので、なぜそれが必要ですか?
アナスタシヤ-ロマノバ秀

7
アナスタシア・Romanova @秀次の2つのボックスから代わりにサンプルができboxes <- list(c(0, 1), c(1, 1))、その後x <- boxes[[sample(2, 1)]]、これは、ほぼ同じ計算時間であることから、なぜ正確にサンプリングプロセスに似ている余分なステップを使用していませんか?結果については何も変わりませんが、シミュレーションを明示的にします。
ティム

ティム、答えてくれてありがとう。私はRがかなり新しいので、最初にあなたの答えを理解する時間をください。今のところ、あなたと@Henryのために+1してください。
アナスタシヤロマノバ秀

1
@ Anastasiya-Romanova秀はい、正確に。コードはボックスをサンプリングし、ボックスからボールを​​サンプリングします。金色(= 1)の場合、ボックスから他のボールも金色(1 + 1 = 2)かどうかをチェックし、はいの場合、それをカウントし、最後に、合計を合計カウントで割ります(つまりを使用しますmean)。
ティム

1
@ Anastasiya-Romanova秀return(NA)は欠損値を返しmean(, na.rm = TRUE)、使用されna.rm = TRUEます。引数は欠損値を無視するように関数に指示します。他のプログラミング言語では、これは異なる方法で実行できます。たとえばcontinuepassキーワードやキーワードを使用します。
ティム

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

Gs

...その他のすべてのケースは、最初の銀(S)抽出を実行し、条件(最初の抽出G)を満たしません。

このように、P(g | G)= 2/3。


7
質問は、モンテカルロソリューションについて尋ねます。
ティム

さて、すべての可能性をリストすることは、モンテカルロの極端なケースです。
ghuezt

4
いいえ、モンテカルロはシミュレーション/ランダム化に関するものです。
ティム

ティム、あなたの数学を正しくしてください。無限に多くのドローを使用すると、等しい確率を持つすべてのケースのリストを正確に取得できます。私は悲しい「極端なケース」と限界を意味しました。
ghuezt

1
もちろん、すべてのケースをリストすることはモンテカルロではありません。正方形は長方形ですが、長方形は正方形ではありません。
ティム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.