跳转至

10.3   贝叶斯推断

社团准备把活动报名页改版。A 版是旧页面,B 版是新页面。小率收集到一小批数据后,不想只听“显著/不显著”,他更想知道:B 版比 A 版好的概率有多大?提升幅度大概是多少?

图 10.3.0 小率用 A/B 数据做贝叶斯推断

版本 访问人数 报名人数
A 版 80 12
B 版 80 18
我能不能直接说:B 版优于 A 版的概率是多少?
这正是贝叶斯推断擅长回答的问题。先给每个版本的转化率算后验,再比较两条后验样本。

10.3.1   后验分布可以直接回答决策问题

贝叶斯推断(Bayesian Inference)拿到后验分布后,可以做四件事:

图 10.3.1 贝叶斯推断从后验分布读出四类答案

输出 含义
后验均值 参数的一个综合估计
信用区间 参数有很大概率落入的范围
概率判断 例如 \(P(B>A\mid D)\)
后验预测 下一批数据可能长什么样

信用区间的直觉

贝叶斯 95% 信用区间可以读作:在当前模型和数据下,参数有 95% 的后验概率落在这个区间内。

10.3.2   从两个转化率后验开始

对 A 版和 B 版都使用弱信息先验:

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

观察数据后:

\[ p_A\mid D_A\sim \text{Beta}(2+12,2+68)=\text{Beta}(14,70) \]
\[ p_B\mid D_B\sim \text{Beta}(2+18,2+62)=\text{Beta}(20,64) \]

如果我们从这两条后验分布里各抽很多样本,就能计算:

\[ P(p_B>p_A\mid D) \]

这比“p 值小于 0.05 吗”更贴近决策语言。

10.3.3   后验预测看下一批可能怎样

后验不只估计当前参数,还能预测未来。比如下一批各来 100 个访问者,我们可以:

  1. \(p_A\) 的后验抽一个转化率。
  2. 用这个转化率模拟 A 版 100 人里有多少报名。
  3. 对 B 版也做同样的事。
  4. 重复很多次,得到下一批结果的预测分布。

别把后验概率当成绝对真理

后验概率依赖模型、先验和数据质量。如果流量来源偏了、实验没有随机分流,后验再漂亮也会建立在有偏数据上。

10.3.4   用 Python 计算 B 优于 A 的概率

配套脚本放在:

docs/assets/scripts/ch10_bayesian/03_bayesian_inference/main.py
import numpy as np
from scipy import stats

rng = np.random.default_rng(42)

a_post = (2 + 12, 2 + 80 - 12)
b_post = (2 + 18, 2 + 80 - 18)

a_samples = rng.beta(*a_post, size=100_000)
b_samples = rng.beta(*b_post, size=100_000)
lift = b_samples - a_samples

print(f"P(B > A) = {(b_samples > a_samples).mean():.3f}")
print(f"提升幅度后验均值 = {lift.mean():.3%}")
print("提升幅度 95% 信用区间 =", np.quantile(lift, [0.025, 0.975]))
所以贝叶斯推断不是只换了一个检验,而是直接把“决策想问的话”算出来。
对。后验分布是一个工具箱,估计、区间、概率判断、预测都从里面拿。

小率的笔记本

贝叶斯推断从后验分布出发。它可以给后验均值、信用区间、某个方案更好的概率,也可以做后验预测。解释结果时要同时说明先验、模型和数据来源。