2  贝叶斯公式之应用

2.1 红球与白球

碗 1 装着 30 颗红球和 10 颗白球
碗 2 装着 20 颗红球和 20 颗白球
请问,随机挑一只碗,然后随机抽一个球,假如抽到的是一颗红球,那这颗红球来自碗一的概率是多少?

最简单也最直接的想法是,我只看最后结果,你抽到的是红球,那这颗红球来自碗一的概率是

\[\frac{30}{30 + 20} = \frac{3}{5}\]

当然,我希望大家可以用贝叶斯公式来计算:

\[\begin{aligned} P(碗_1 | 红球) &= \frac{P(碗_1)P(红球 | 碗_1)}{P(红球)} & = \frac{\frac{1}{2} \cdot \frac{3}{4}}{\frac{5}{8}} &= \frac{3}{5} \end{aligned}\]

贝叶斯公式普遍的情形是这样:

\[P(h|d) = \frac{P(h) P(d|h)}{P(d)}\]

其中 \(h\) 表示 hypothesis,\(d\) 表示数据。我们把 \(P(h)\) 称为 prior (先验概率),\(P(d|h)\) 称为 likelihood (似然),\(P(h|d)\) 称为 posterior.

在这里的话:

  • hypothesis: 红球来自碗一这个假设
  • data: 实际观测到的情况 (随机抽一只碗,随机抽一颗球,抽到了红球)

下面是概率,可以是一个分布也可以是一组数:

  • \(P(h)\),先验概率 (Prior),这里的 h 是指 hypothesis),是说知道数据之前假设为真的概率。这里不是碗一就是碗二,所以 \(P(\text{碗一}) = 0.5\)

  • \(P(d|h)\),似然 (Likelihood),假设为真的前提下观测到数据的概率。这里 \(P(\text{红球}|\text{碗一}) = 0.75\)

  • \(P(d)\) 是观测到的概率,也就是

    \[ P(\text{红球}) = P(\text{碗}_1) P(\text{红球} \mid \text{碗}_1) + P(\text{碗}_2) P(\text{红球} \mid \text{碗}_2) \]

    代入具体值

    \[ P(\text{红球}) = \frac{1}{2} \cdot \frac{3}{4} + \frac{1}{2} \cdot \frac{1}{2} = \frac{5}{8} \]

  • posterior: \(P(h|d)\)

贝叶斯公式如下: \[ P(\text{碗}_1 \mid \text{红球}) = \frac{P(\text{碗}_1) P(\text{红球} \mid \text{碗}_1)}{P(\text{红球})} \]

将这些值代入贝叶斯公式:

\[ P(\text{碗}_1 \mid \text{红球}) = \frac{\frac{1}{2} \cdot \frac{3}{4}}{\frac{5}{8}} = \frac{3}{5} \]

2.2 贝叶斯表

上面的计算其实比较麻烦,我们有更简单的办法:

import pandas as pd
table = pd.DataFrame(index = ["碗1", "碗2"])

table['prior'] = 1/2, 1/2
table
prior
碗1 0.5
碗2 0.5

在上面那个球与碗的情形中,hypothesis 是该红球来自碗一,data 是抽到一颗红球,prior 是 \(p(碗_1)\),likelihood 是 \(p(红球|碗_1)\),posterior 是 \(p(碗_1 | 红球)\)

那我们接着:

table['likelihood'] = 3/4, 1/2
table
prior likelihood
碗1 0.5 0.75
碗2 0.5 0.50

然后 \(prior * likelihood\),也就是 \(P(碗_1)P(红球 | 碗_1)\):

table['unnorm'] = table['prior'] * table['likelihood']
table
## unnorm 表示 unnormalized posteriors
prior likelihood unnorm
碗1 0.5 0.75 0.375
碗2 0.5 0.50 0.250

因为我们知道 \(p(d)\) 也就是 \(p(红球)\)\(\frac{5}{8}\),所以:

table['posterior'] = table['unnorm'] / (5/8)
table
prior likelihood unnorm posterior
碗1 0.5 0.75 0.375 0.6
碗2 0.5 0.50 0.250 0.4

这个结果和我们算出来的 \(3/5\) 是一致的。我们甚至还知道了 \(p(碗_2|红球) = \frac{2}{5}\)

其实,更简单的做法是,既然 unnormposterior 的非标准化版,那我们把 unnorm 标准化一下不就好了吗?怎么标准化?除以 unnorm 的和就可以了。

table['posterior_again'] = table['unnorm'] / table['unnorm'].sum()
table
prior likelihood unnorm posterior posterior_again
碗1 0.5 0.75 0.375 0.6 0.6
碗2 0.5 0.50 0.250 0.4 0.4

2.3 骰子问题

假设我们有三个骰子:6 面的、8 面的、12 面的。A 君随机抽一个骰子,然后抛向空中,落下来的数字是 1。A 君让 B 君说出这个骰子是 6 面的概率。

我们来分析一下,我们想知道的是 \(p(dice = 6 | number = 1)\),所以:

  • prior: \(p(dice = 6)\)
  • likelihood: \(p(number = 1 | dice = 6)\)
  • data: \(p(number = 1)\)
  • posterior: \(p(dice = 6 | number = 1)\)
table2 = pd.DataFrame(index = [6, 8, 12])
from fractions import Fraction
table2['prior'] = Fraction(1,3)
table2['likelihood'] = Fraction(1,6), Fraction(1,8), Fraction(1, 12)
table2
prior likelihood
6 1/3 1/6
8 1/3 1/8
12 1/3 1/12
table2['unnorm'] = table2['prior'] * table2['likelihood']
table2
prior likelihood unnorm
6 1/3 1/6 1/18
8 1/3 1/8 1/24
12 1/3 1/12 1/36

我们知道 “unnorm” 基本上已经是 posterior 了,唯一的区别是其还未标准化。

table2['posterior'] = table2['unnorm']/table2['unnorm'].sum()
table2
prior likelihood unnorm posterior
6 1/3 1/6 1/18 4/9
8 1/3 1/8 1/24 1/3
12 1/3 1/12 1/36 2/9

2.4 三重门

假设你在参加一个电视节目。你面前是三扇门。其中一扇门后面是一辆法拉利,其余两扇门后面各是一只山羊。你随机挑一扇门,不管打开后是什么,都归你了。你当然希望后面是一辆法拉利。你随机挑了门 A,告诉了主持人,主持人打开了门 C,后面是一只山羊,主持人问你,你是坚持选择 A 还是换成 B。

主持人通常这么行事:

  1. 主持人总会打开一扇门,给你机会重新选择
  2. 他从来不会打开有车的门
  3. 如果你选择了有车的那扇门,他会从另外两扇门中随机选一扇门打开

现在问你,汽车在门 A 和门 B 后的概率分别是多少?

你可能会觉得各是 1/2,但其实不是。我们用贝叶斯来计算一下。

因为我们要选择的是门,所以 hypothesis 是车在某门之后,故 prior 是 \(p(车在某门之后)\):车在 A, B, C 之后。

Data: 主持人打开了 C,我们看到了一只山羊。

Likelihood 是 \(p(\text{Data} | h)\)

Posterior 是 \(p(h | \text{Data})\)

记住 prior 是在我们什么都不知道、没有任何数据的情况下所做的预测。

table3 = pd.DataFrame(index = ['A', 'B', 'C'])
table3['prior'] = Fraction(1, 3)
table3
prior
A 1/3
B 1/3
C 1/3

我们来分析 Likelihood。Likelihood 指的是在某一 hypothesis 的情况下,这个 data 的概率。我们挨个分析。

如果 hypothesis 是车在 A, 那么主持人打开 C 的概率是 \(1/2\)

如果 hypothesis 是车在 B,他必须给你选择的机会,但他不能打开 A,只能打开 C,所以这个 data 的概率是 1。

如果 hypothesis 是车在 C,那么主持人打开 C 的概率是 0,因为他不能打开有车的那扇门。

所以:

table3['likelihood'] = Fraction(1, 2), 1, 0
table3['unnorm'] = table3['prior'] * table3['likelihood']
table3['posterior'] = table3['unnorm']/(table3['unnorm'].sum())
table3
prior likelihood unnorm posterior
A 1/3 1/2 1/6 1/3
B 1/3 1 1/3 2/3
C 1/3 0 0 0

由此我们看到,车在 B 门之后的概率要更高。