跳转至

10.2   先验、似然与后验

第二天,小率又带来了新记录。第一天抛了 4 次,3 正 1 反;第二天抛了 8 次,4 正 4 反。他的问题变得更实际:每天都有新数据时,难道要从头重算一遍吗?

图 10.2.0 小率把两天硬币数据带给均哥

批次 正面 反面
第 1 天 3 1
第 2 天 4 4
昨天算完了后验,今天又来了数据。我要把昨天的数据翻出来一起重算吗?
不用。贝叶斯最漂亮的一点就是:今天的后验,可以直接当明天的先验。

10.2.1   三个分布各管一件事

贝叶斯公式里最容易混的就是三件套:

图 10.2.1 先验、似然、后验和顺序更新

名称 符号 负责的问题
先验 Prior \(P(\theta)\) 看数据前,我怎么想?
似然 Likelihood \(P(D\mid\theta)\) 如果参数是这个值,数据有多合理?
后验 Posterior \(P(\theta\mid D)\) 看完数据后,我该怎么想?
证据 Evidence \(P(D)\) 用来把后验归一化

贝叶斯公式写成:

\[ P(\theta \mid D)=\frac{P(D\mid\theta)P(\theta)}{P(D)} \]

实际理解时先抓住比例关系:

\[ P(\theta \mid D)\propto P(D\mid\theta)P(\theta) \]

10.2.2   后验是先验和似然的合力

如果先验很宽,说明你原来没有太强看法,数据就更容易主导后验。如果先验很窄,说明你原来很确信,少量数据不容易把它拉走。

似然不是参数的概率

似然把数据当作已经观察到的事实,比较不同参数对这批数据的解释力。它通常不对参数积分为 1,所以不要把似然直接叫作“参数的概率分布”。

在硬币问题里,若先验是:

\[ p\sim \text{Beta}(2,2) \]

第一天观察到 3 正 1 反,后验是:

\[ p\mid D_1\sim \text{Beta}(2+3,2+1)=\text{Beta}(5,3) \]

这就是 Beta-Binomial 的便利之处:成功次数加到第一个参数,失败次数加到第二个参数。

10.2.3   顺序更新不用从头开始

第二天又观察到 4 正 4 反。我们可以把第一天的后验当作第二天的先验:

\[ \text{Beta}(5,3)+4\text{ 正}+4\text{ 反} =\text{Beta}(9,7) \]

如果把两天合并起来一次算:

\[ \text{Beta}(2+7,2+5)=\text{Beta}(9,7) \]

结果完全一样。

分批更新和一次合并竟然一样?
是的。只要模型一致,贝叶斯更新天然支持“接力”。

10.2.4   先验可以强,也可以弱

不同先验表达不同信息量:

先验类型 例子 含义
弱信息先验 Beta(2, 2) 大概觉得硬币公平,但允许数据改变看法
平坦先验 Beta(1, 1) 0 到 1 之间都差不多可能
强信息先验 Beta(50, 50) 非常相信硬币接近公平
偏向先验 Beta(8, 2) 事前相信正面概率偏高

强先验不是不能用,但要能解释来源。比如来自长期历史数据、物理机制、前期实验,才比较站得住。

敏感性分析

重要结论最好换几个合理先验再跑一次。如果后验结论变化很大,说明当前数据还不足以压过先验,报告时要诚实说明。

10.2.5   用 Python 演示两天接力

配套脚本放在:

docs/assets/scripts/ch10_bayesian/02_prior_and_posterior/main.py
from scipy import stats

a, b = 2, 2

for day, heads, tails in [("第1天", 3, 1), ("第2天", 4, 4)]:
    a += heads
    b += tails
    mean = a / (a + b)
    lo, hi = stats.beta.ppf([0.025, 0.975], a, b)
    print(day, f"后验 Beta({a},{b})", f"均值={mean:.3f}", f"95% CrI=({lo:.3f},{hi:.3f})")

小率的笔记本

先验回答“数据前怎么想”,似然回答“数据支持哪些参数”,后验回答“数据后怎么想”。贝叶斯更新可以分批接力:上一批数据得到的后验,可以直接作为下一批数据的先验。