跳转至

10.4   共轭先验

均哥在厨房桌上摆了几盒彩色弹珠。小率一边数,一边发现一个奇妙规律:有些贝叶斯更新不用复杂积分,只要把计数加到参数上,后验仍然属于同一个分布家族。

图 10.4.0 用弹珠理解共轭先验

为什么前面硬币例子里,Beta 先验看完二项数据以后,后验还是 Beta?
这就叫共轭。先验和后验属于同一家族,计算像记账。

10.4.1   共轭让后验还留在同一家族

共轭先验(Conjugate Prior)指的是:对于某个似然函数,选择某类先验后,得到的后验仍然属于同一类分布。

图 10.4.1 共轭先验把贝叶斯更新变成参数加法

最典型的是 Beta-Binomial:

\[ p\sim \text{Beta}(a,b),\quad X\sim \text{Binomial}(n,p) \]

若观察到成功 \(k\) 次、失败 \(n-k\) 次:

\[ p\mid D\sim \text{Beta}(a+k,b+n-k) \]

看到了吗?分布名字没变,只是参数变了。

10.4.2   Beta-Binomial 像给成功和失败记账

如果 \(a=2,b=2\),可以把它想成“先验里已有 2 份成功证据和 2 份失败证据”。看到 6 次成功、4 次失败后:

\[ \text{Beta}(2,2)\rightarrow \text{Beta}(8,6) \]

伪计数

Beta 分布的参数常被解释成伪计数。这个解释不总是严格等同于真实样本,但非常适合建立直觉。

10.4.3   多类别数据用 Dirichlet-Multinomial

如果不是硬币两类,而是多个类别,比如饮料口味投票:

口味 票数
柠檬茶 18
乌龙茶 25
果茶 12

多类别概率向量可以用 Dirichlet 先验:

\[ \boldsymbol{\pi}\sim \text{Dirichlet}(\alpha_1,\alpha_2,\alpha_3) \]

看到各类别计数 \(n_1,n_2,n_3\) 后:

\[ \boldsymbol{\pi}\mid D\sim \text{Dirichlet}(\alpha_1+n_1,\alpha_2+n_2,\alpha_3+n_3) \]

这也是参数加法。

10.4.4   共轭很好用,但不是万能

共轭先验的优点:

  • 计算快,很多时候有闭式解。
  • 便于手算和教学。
  • 适合在线更新。
  • 能清楚解释先验等价于多少信息。

限制也很明显:

  • 不是所有模型都有方便的共轭形式。
  • 为了共轭而选先验,可能牺牲真实表达。
  • 复杂层次模型通常需要 MCMC 或变分推断。

不要为了好算而选错先验

共轭是计算便利,不是统计真理。如果先验不符合实际问题,闭式解再漂亮也不值得。

10.4.5   用 Python 做共轭更新

配套脚本放在:

docs/assets/scripts/ch10_bayesian/04_conjugate_priors/main.py
import numpy as np

# Beta-Binomial
a, b = 2, 2
success, fail = 6, 4
print("Beta 后验:", (a + success, b + fail))

# Dirichlet-Multinomial
alpha = np.array([2, 2, 2])
counts = np.array([18, 25, 12])
posterior = alpha + counts
print("Dirichlet 后验参数:", posterior)
print("后验均值:", posterior / posterior.sum())

小率的笔记本

共轭先验让后验和先验留在同一个分布家族。Beta-Binomial、Dirichlet-Multinomial 都能把更新写成参数加法。共轭很快、很好解释,但不能为了好算牺牲问题本身。