Think Bayes Note 4: 骰子问题
Contents [show]
1. 问题描述
有一盒骰子,里面有 4 面、6 面、8 面、12 面、20 面的骰子各 1 个。现从这盒骰子中随机选出一个,投掷得到了 6,求每个骰子被选中的概率是多少。
2. 推导求解
假设 H4、H6、H8、H12、H20 分别为选中了 4 面、6 面、8 面、12 面、20 面的骰子,记 D 为投掷得到了 6。
认为每个骰子被选中的先验概率相同,即:
H4=H6=H8=H12=H20=15
如果选中的是 4 面骰子,它不可能投出 6,故 P(D|H4)=0。如果选中的是 6 面骰子,它投出 6 的概率为 16,即 P(D|H6)=16。以此类推,得到:
P(D|H4)=0P(D|H6)=16P(D|H8)=18P(D|H12)=112P(D|H20)=120
由全概率公式,得到投出 6 的概率为:
P(D)=∑i=4,6,8,12,20P(Hi)P(D|Hi)=15×0+15×16+15×18+15×112+15×120=17200
由贝叶斯公式,得到在投掷得到了 6 后,i 面(i=4,6,8,12,20)骰子被选中的概率为:
P(Hi|D)=P(Hi)P(D|Hi)P(D)
代入之前的计算结果,得到:
P(H4|D)=0P(H6|D)=2051≈0.3922P(H8|D)=517≈0.2941P(H12|D)=1051≈0.1961P(H20|D)=217≈0.1176
3. 代码求解
定义 Dice
类如下:
class Dice(Suite): def likelihood(self, data, hypo): if hypo < data: return 0 else: return 1.0 / hypo
其中 likelihood()
方法用于计算似然度,其参数 data
为投出的点数,参数 hypo
为假设选中的骰子的面数。如果投出的点数大于选中的骰子,此事件不可能发生,故返回 0
;否则 hypo
面骰子投出 data
点数的概率为骰子面数分之一,返回 1.0 / hypo
。
使用方法为:
dice = Dice([4, 6, 8, 12, 20]) dice.update(6) dice.print()
输出为:
prob value 4 0.00000 6 0.00000 8 0.96184 12 0.03753 20 0.00063
结果与前述分析相同。
4. 继续投掷
继续投掷骰子,得到点数 6、8、7、7、5、4,则此时每个骰子被选中的概率可以由如下代码计算:
for roll in [6, 8, 7, 7, 5, 4]: dice.update(roll) dice.print()
输出为:
prob value 4 0.000000 6 0.000000 8 0.943248 12 0.055206 20 0.001545