Think Bayes Note 3: M&M 豆问题
1. 问题描述
M&M 豆是一种混合各种颜色的巧克力豆,生产厂商会不时地调整各种颜色的巧克力豆之间的比例。1995 年之前,一袋 M&M 豆的颜色比例为:30% 褐色,20% 黄色,10% 绿色,10% 橙色,10% 黄褐色。1995 年推出了蓝色巧克力豆,此时一袋 M&M 豆的颜色比例变为:24% 蓝色,20% 绿色,16% 橙色,14% 黄色,13% 红色,13% 褐色。
假设有 1994 年和 1996 年的 M&M 豆各一袋,但不知道那一袋是哪一年的。现在从两袋中各取一个巧克力豆,发现一个是黄色,一个是绿色,求黄色豆子来自 1994 年袋子的概率。
2. 推导求解
记取出黄色豆子的袋子为袋 1,另一个袋子为袋 2,假设 $H_A$ 为袋 1 是 1994 年的,袋 2 是 1996 年的;假设 $H_B$ 为袋 1 是 1996 年的,袋 2 是 1994 年的。记 D 为从两袋中各取一个巧克力豆,得到黄色和绿色豆子各一个。
可以认为 $H_A$ 和 $H_B$ 等可能,即:
\begin{equation}
P(H_A) = P(H_B) = 0.5 \tag{1}
\end{equation}
根据问题描述可知,从 1994 年袋子中取出黄色豆子的概率为 20%,取出绿色豆子的概率为 10%;从 1995 年袋子中取出黄色豆子的概率为 14%,取出绿色豆子的概率为 20%。由此可知,如果 $H_A$ 成立,则黄色豆子来自袋 1,绿色豆子来自袋 2,其概率为 $20% \times 20% = 0.04$;同理,如果 $H_B$ 成立,则黄色豆子来自袋 2,绿色豆子来自袋 1,其概率为 $14% \times 10% = 0.014$,即:
\begin{equation}
P(D|H_A) = 0.04 \tag{2}
\end{equation}
\begin{equation}
P(D|H_B) = 0.014 \tag{3}
\end{equation}
由全概率公式,可得 D 发生的概率为:
\begin{equation}
P(D) = P(H_A)P(D|H_A) + P(H_B)P(D|H_B) = 0.5 \times 0.04 + 0.5 \times 0.014 = 0.027 \tag{4}
\end{equation}
由贝叶斯公式,得黄色豆子来自 1994 年袋子的概率,即 $P(H_A|D)$ 为:
\begin{equation}
P(H_A|D) = \frac{P(H_A)P(D|H_A)}{P(D)} = \frac{0.5 \times 0.04}{0.027} = \frac{20}{27} \approx 0.7407
\end{equation}
3. 代码求解
定义 MM
类如下:
class MM(Suite): mix_94 = {'brown': 30, 'yellow': 20, 'red': 20, 'green': 10, 'orange': 10, 'tan': 10, 'blue': 0} mix_96 = {'blue': 24, 'green': 20, 'orange': 16, 'yellow': 14, 'red': 13, 'brown': 13, 'tan': 0} hypo_a = {'Bag 1': mix_94, 'Bag 2': mix_96} hypo_b = {'Bag 1': mix_96, 'Bag 2': mix_94} hypotheses = {'A': hypo_a, 'B': hypo_b} def likelihood(self, data, hypo): bag, color = data mix = self.hypotheses[hypo][bag] like = mix[color] return like
其中 mix_94
和 mix_96
保存了两袋豆子中的颜色比例,hypo_a
和 hypo_b
分别对应 $H_A$ 和 $H_B$。 likelihood()
方法的 data
参数为取出豆子的袋子和豆子颜色组成的元组,如 ('Bag 1', 'yellow')
表示从袋 1 中取出了黄色豆子;hypo
参数为假设,即 A
或 B
。
MM
的使用方法为:
mm = MM('AB') mm.update(('Bag 1', 'yellow')) mm.update(('Bag 2', 'green')) mm.print()
输出为:
prob value A 0.740741 B 0.259259