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_94mix_96 保存了两袋豆子中的颜色比例,hypo_ahypo_b 分别对应 $H_A$ 和 $H_B$。 likelihood() 方法的 data 参数为取出豆子的袋子和豆子颜色组成的元组,如 ('Bag 1', 'yellow') 表示从袋 1 中取出了黄色豆子;hypo 参数为假设,即 AB

  MM 的使用方法为:

mm = MM('AB')
mm.update(('Bag 1', 'yellow'))
mm.update(('Bag 2', 'green'))
mm.print()

输出为:

           prob
value          
A      0.740741
B      0.259259