10.4 共轭先验¶
均哥在厨房桌上摆了几盒彩色弹珠。小率一边数,一边发现一个奇妙规律:有些贝叶斯更新不用复杂积分,只要把计数加到参数上,后验仍然属于同一个分布家族。
为什么前面硬币例子里,Beta 先验看完二项数据以后,后验还是 Beta?
这就叫共轭。先验和后验属于同一家族,计算像记账。
10.4.1 共轭让后验还留在同一家族¶
共轭先验(Conjugate Prior)指的是:对于某个似然函数,选择某类先验后,得到的后验仍然属于同一类分布。
最典型的是 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 做共轭更新¶
配套脚本放在:
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 都能把更新写成参数加法。共轭很快、很好解释,但不能为了好算牺牲问题本身。

