
先说一个我实际工作里经常被问到的场景你在监控一个页面的转化率某天一共积累了 4320 次点击、成交 86 单点估计是 86/4320 ≈ 1.99%。但老板问的不是“今天转化率多少”而是“这个转化率到底靠不靠谱有没有达到 2% 的线”。如果你只会回答一个点估计你会发现这话根本没法接。真正有用的答案是p 是一个随机变量它有分布有区间有概率。而要把这个回答讲清楚你绕不开二项分布和 Beta 分布这对共轭先验。这篇文章就是围绕“二项分布与 Beta 分布的共轭性证明与参数含义”写的。我会先用一个常见的统计推断问题说清楚共轭性到底解决了什么然后把 Beta 分布与二项分布的关系掰开揉碎给出完整的共轭性数学证明接着逐个解释 α 和 β 这两个参数从先验到后验的整个演变过程最后用一段可以直接复制的 Python 代码做一个贝叶斯 A/B 测试。适合的人群很明确正在学贝叶斯统计的学生、做数据分析或数据科学但不想只会调包的人以及被“先验怎么选”困扰的产品和算法同学。1. 共轭性到底解决了什么问题1.1 贝叶斯公式的另一种理解方式贝叶斯统计的核心公式长得人尽皆知后验 ∝ 先验 × 似然但很多人对它其实只有一个抽象的印象真到用的时候反而不知道从哪下手。我建议换一种理解方式先验是你在看到数据之前对参数 p 的判断似然是数据对 p 的“投票”后验是把这两份信息加权合并之后的最终判断。问题在于如果先验和似然来自不同的分布家族你合并出来的后验很可能是一个谁都不认识的复杂分布。比如先验选了一个均匀分布似然是二项分布理论上后验也能算但写出来以后那个密度函数可能带着没法解析的积分你只能硬着头皮做数值逼近。每来一批新数据就得重新算一次这在真实工作里是极其痛苦的。共轭先验的意义就在于当我选定 Beta 分布作为先验、二项分布作为似然合并之后的后验还是 Beta 分布只是参数变了。这意味着整条更新链条是闭环的数据每进来一批我只要做一次参数加法就能继续维持同一个分布家族的语法后续所有推断和可视化都可以沿用同一套逻辑。1.2 为什么说这是“先验强度”问题的关键共轭性还有一个隐蔽的好处它让你能直观地改造先验的强度。先验不是玄学它本质上是在告诉模型“我事先有多大把握”。Beta 分布的 α 和 β 可以被理解为“伪计数”也就是等价于事先观察到了多少次成功和失败。伪计数越大先验在最终结果里占的权重越大。我在实际项目里测试过同样的数据配合不同强度的先验当样本量只有几十条时Beta(1,1) 更新出来的后验区间宽得根本没法做决策而 Beta(5,5) 的后验则相对稳定。这其实提示了一个很实用的经验当你开始一个转化率、留存率或点击率实验时先验的选择不应随意拍脑袋而应该来自历史数据的合理归纳。1.3 没有共轭性时你会遇到什么为了让你更清楚共轭性的价值我描述一下不用共轭先验的处境。假设你选了一个 Lognormal 先验来描述转化率 p又用二项分布做似然。数学上后验依然可以写出来但那个密度函数的归一化常数无法解析你只能用 MCMC 采样或者网格近似。这不是说 MCMC 不好而是说大部分日常工作根本不需要这种重量级武器。共轭先验在没有足够计算资源、需要频繁更新或需要快速解释结果的业务场景里是性价比最高的选择。我经常跟团队里的同学说先判断能不能用共轭结构不能用了再去请 MCMC 出场这才是合理的工程顺序。2. 两个主角Beta 分布与二项分布2.1 Beta 分布的形式与直觉图像Beta 分布是在 [0,1] 区间上定义的连续分布专门用来描述比例、概率类参数。它的密度函数写成f(p) [Γ(αβ) / (Γ(α)Γ(β))] · p^(α-1) · (1-p)^(β-1), 0 p 1其中 α 0、β 0Γ 是 Gamma 函数。别看这个式子有点唬人它的形状其实是可控且非常灵活的。α β 1 时Beta 分布退化为均匀分布 U(0,1)表示对 p 没有任何先验偏好。α 1、β 1 且 α 与 β 接近时分布呈钟形峰值落在 α/(αβ) 附近。α 1、β 1 时分布密度在两端高中间低呈 U 形。α 和 β 同时增大时分布整体变“瘦”方差缩小。Beta 分布还有两个方便计算的统计量。期望是E[p] α / (α β)方差是Var[p] αβ / ((α β)^2 (α β 1))从这两个式子就能看出α β 直接决定了分布的集中程度。同样期望都是 0.5Beta(50,50) 比 Beta(2,2) 的分布窄得多代表先验信心强得多。这就是 α 和 β 的第一个直观含义。2.2 二项分布在这里扮演的角色二项分布描述的是在 p 固定不变的条件下做过 n 次独立重复试验恰好成功 k 次的概率。密度概率质量函数写作P(k | n, p) C(n, k) · p^k · (1-p)^(n-k)注意这里面 n 和 k 是已知的观测数据p 才是未知参数。在共轭结构中二项分布承担的是似然函数的角色也就是给参数 p 打分如果真实 p 接近 k/n这个观测结果出现的概率就高如果偏离太多概率就低。需要特别强调一点在贝叶斯框架里二项分布公式中的 p 不再是一个固定的数而是服从某个分布。这个观念转换往往是最难的也是很多教科书没有讲透彻的地方。2.3 “同类相吸”的数学原因Beta 分布里有一块 p^(α-1) (1-p)^(β-1)二项分布里有一块 p^k (1-p)^(n-k)。两个式子相乘时指数可以直接相加。这是共轭性成立的数学根源。从指数族的角度看二项分布对 p 的充分统计量是 kBeta 分布的充分统计量也是“伪成功次数”和“伪失败次数”它们的自然参数结构互相匹配。说得直白点它们就像同一把锁的两把钥匙形状天然契合。理解到这一层以后你再看到“共轭”这个术语就不会觉得它是什么神秘魔法而是数学结构上的“对上了”。3. 共轭性的完整证明一步步算给你看3.1 写下先验、似然与贝叶斯公式我习惯每次推导都把三件事并列写清楚。先验是π(p) Beta(α, β) [Γ(αβ) / (Γ(α)Γ(β))] · p^(α-1) · (1-p)^(β-1)给定 n 次试验中观察到 k 次成功似然是L(p) P(k | n, p) C(n, k) · p^k · (1-p)^(n-k)贝叶斯公式说后验密度正比于二者乘积π(p | k, n) ∝ π(p) · L(p)这个公式里的 C(n,k) 和 Gamma 函数的分母都不含 p它们只是常数。后面化简时可以暂时忽略等最后再补回来。3.2 相乘与合并指数把两个表达式乘起来先看核心部分π(p | k, n) ∝ p^(α-1) · (1-p)^(β-1) · p^k · (1-p)^(n-k)同底数指数相加得到π(p | k, n) ∝ p^(α k - 1) · (1-p)^(β n - k - 1)请注意这一步是全部证明中最重要的一步。它告诉我们后验密度在形式上和 Beta 分布完全一致只是参数从 (α, β) 变成了 (αk, βn-k)。3.3 恢复归一化常数为了让后验密度积分等于 1我们补回归一化常数。一个标准的 Beta(α, β) 密度的归一化常数是Γ(αβ) / (Γ(α)Γ(β))把 α 替换为 αkβ 替换为 βn-k就得到π(p | k, n) [Γ(αβn) / (Γ(αk)Γ(βn-k))] · p^(αk-1) · (1-p)^(βn-k-1)结论明确如果先验是 Beta(α, β)观测到 n 次试验、k 次成功后后验是 Beta(αk, βn-k)。共轭性得证。3.4 更新规则背后的直觉把结论翻译成一句业务语言先验里的 α 本来就是“伪成功次数”β 本来就是“伪失败次数”看到真实数据后我们把真实成功次数 k 加到 α 上把真实失败次数 n-k 加到 β 上。这是整个贝叶斯更新过程里最优雅的地方。你不需要做任何积分不需要 MCMC数据一到手直接做加法。我在实际写代码时会用一个大括号把这几个参数变化写成一行配置然后再在后面接后验均值和区间计算逻辑非常清晰。4. α 和 β 的参数含义从“伪计数”到“等效样本量”4.1 把 α、β 翻译成历史经验如果你第一次接触 Beta 分布最困惑的往往是先验参数到底怎么取我的经验是永远把 α 和 β 想象成你过去积累的“成功”和“失败”次数。假设你之前做过一个类似渠道的历史测试100 次尝试里成功了 30 次。你可以用 Beta(30,70) 作为本次实验的先验。这等价于在说在我看新数据之前我已经拥有 30 次成功和 70 次失败的证据了。新数据进来后系统只需要把新旧成功数相加就能得到最终判断。这种参数化最大的优点是让先验变得可解释。我见过很多分析报告只写“我用了 Beta(1.5, 1.5) 作为弱先验”却没有解释 1.5 是怎么来的。实际上这个参数意味着你在先验中模拟了 3 次试验其中差不多一半成功一半失败相当于一个非常弱的假设。坏处是它很模糊别人没法复现你的判断逻辑。4.2 后验均值是如何“加权”的把先验均值和后验均值放在一起看会发现非常漂亮的加权结构。先验均值是μ0 α / (α β)后验均值是μ1 (α k) / (α β n)它可以重写成μ1 (αβ)/(αβn) · μ0 n/(αβn) · (k/n)也就是说后验均值是先验均值与样本均值的加权平均权重之比恰好是先验等效样本量与真实样本量之比。αβ 被称作“等效样本量”。这个观点我在实际工作中反复使用如果你想控制历史数据带来的惯性就把等效样本量调低如果你明确知道历史规律的稳定性就提高它。举个例子。你有一个全新渠道的 200 次点击、8 次转化样本均值为 4%。先验采历史上渠道的 Beta(40,960)等效样本量 1000先验均值 4%。后验均值 (1000×4% 200×4%) / 1200 4%后验还是 4%但分布变得更窄因为新旧数据方向一致。而如果新渠道样本均值是 10%后验均值会从 4% 往 10% 方向移动但不会直接变成 10%。4.3 先验强度与敏感性分析等效样本量直接决定了先验有多“固执”。我在团队评审实验时总会要求大家把先验的后验均值变化图和不同等效样本量下的结论一起放出来。如果等效样本量从 10 变成 1000 结论就翻转了说明这个结论对先验极度敏感不能作为决策依据。稳定后验的另一种做法是故意把 αβ 压得很低例如 Beta(0.5, 0.5)。这在文献里叫 Jeffreys 先验它在比例参数推断里有不变性性质适合确实没有可靠历史信息的场景。4.4 预测分布用参数含义做下一次预测共轭结构还顺手给了你一个做预测的便捷工具。在 Beta 先验下下一次独立试验成功的预测概率是P(下次成功) (α k) / (α β n)如果要对未来 m 次试验中成功次数做预测用的就是 Beta-Binomial 复合分布。这里我不展开它的公式只说应用价值。做容量规划和实验设计时我经常用这个预测分布而不是简单地乘一个点估计因为它把参数不确定性自然传播到了最终的业务预判中。5. 实操用共轭性完成一个贝叶斯 A/B 测试5.1 实验设计与先验设定假设你要对比两个版本的落地页转化率。A 版本是存量页面之前推广中累计有 500 次试验、15 次定向转化所以先验合理取 Beta(15, 485)。B 版本是全新创意没有历史依据我们用 Jeffreys 先验 Beta(0.5, 0.5)。跑了两周实验得到 A 组 n3000、k96B 组 n3000、k120。注意这里先验差异体现了你对两个版本的信任程度而共轭结构让这些不同先验能够无缝地接入同一套更新机制。5.2 核心代码实现下面这段代码是我在项目里经常写的模板可以直接复制到 Jupyter 里跑。import numpy as np from scipy import stats alpha_A0, beta_A0 15, 485 alpha_B0, beta_B0 0.5, 0.5 n_A, k_A 3000, 96 n_B, k_B 3000, 120 alpha_A1, beta_A1 alpha_A0 k_A, beta_A0 (n_A - k_A) alpha_B1, beta_B1 alpha_B0 k_B, beta_B0 (n_B - k_B) mean_A alpha_A1 / (alpha_A1 beta_A1) mean_B alpha_B1 / (alpha_B1 beta_B1) print(A posterior mean: %.4f % mean_A) print(B posterior mean: %.4f % mean_B) # 用蒙特卡洛计算 P(p_A p_B) rng np.random.default_rng(42) samples_A rng.beta(alpha_A1, beta_A1, size200000) samples_B rng.beta(alpha_B1, beta_B1, size200000) prob (samples_B samples_A).mean() print(P(B is better than A): %.4f % prob) # 95% 等尾可信区间 lower_A, upper_A np.percentile(samples_A, [2.5, 97.5]) lower_B, upper_B np.percentile(samples_B, [2.5, 97.5]) print(A 95%% credible interval: [%.4f, %.4f] % (lower_A, upper_A)) print(B 95%% credible interval: [%.4f, %.4f] % (lower_B, upper_B))说一下这段代码里的两个关键决策点。第一为什么用 200000 次采样而不是 2000 次因为我们是拿蒙特卡洛模拟来稳健估计一个很小的概率差样本量不足时尾部的判断会不稳定。第二为什么打印等尾区间而不是最高密度区间因为等尾区间实现简单在汇报时也更直观如果后验明显偏斜再去算 HDI 也不迟。5.3 结果解读与决策门槛按上面的参数A 后验均值约 0.0367B 后验均值约 0.0401P(B better) 大概在 0.995 左右。这个数要是低于 0.95我通常不会直接宣布 B 胜出而是继续积累样本。我要特别提醒的是很多团队喜欢用“P(B better) 0.95”作为唯一决策标准这在业务上是有风险的。还需要看看两者的绝对差值分布。比如你可以计算差值的 95% 区间diff samples_B - samples_A lower_diff, upper_diff np.percentile(diff, [2.5, 97.5])如果差值的下界只有 0.1 个百分点即使概率上 B 胜出业务意义也可能不够大。我见过太多 A/B 测试“统计显著但业务无意义”的案例所以建议把差值可信区间和 P(B better) 一起摆到决策会上。6. 常见错误与排查技巧6.1 分不清“分布”和“样本”的概念这是新手最容易出的问题。二项分布描述的是数据的分布Beta 分布描述的是参数 p 的分布。很多人在代码里直接把stats.binom.rvs的结果当成 Beta 样本去画图画出来的东西当然是错的。正确的思路是数据样本通过似然函数影响参数分布参数 p 的分布通过 Beta 给出预测下一次试验成功率时再把参数不确定性积分掉。三个环节各有各的分布不能混为一谈。6.2 拉普拉斯平滑不等于 Beta 先验拉普拉斯平滑常常被当作“加上一个先验”来解释甚至有人直接把成功次数加 1、失败次数加 1然后说“我用了 Beta(1,1) 先验”。这在点估计层面确实等价但两者有本质区别拉普拉斯平滑最终给出的还是一个点估计而 Beta 先验更新后给出的是完整的后验分布。如果你只关心下单率排序那加 1 平滑可能就够用了如果你要做概率性决策比如比较两个版本谁更优并输出一个置信程度就必须用完整的共轭后验。我建议把前者当作工程快速通道把后者当作正式决策工具。6.3 HDI 和等尾区间混用等尾区间把 2.5% 和 97.5% 的分位点各切一刀当后验分布偏斜时它可能会把真正密度高的区域排除在外。最高密度区间则会寻找包含 95% 概率密度的最短区间。对于 Beta 分布当 αk 和 βn-k 都大于 1 且比例不太极端时两种区间差异不大但当后验非常偏斜时比如成功次数特别少等尾区间会明显偏宽。实际问题排查时我会先用等尾区间做快速判断如果结论离阈值很近再换用 HDI 或者直接画密度曲线确认。6.4 常见问题速查表现象可能原因排查方向后验均值严重偏离样本 k/n先验等效样本量过大减小 αβ检查先验来源两个版本 P(B better) 一直卡在 0.8 上下样本量不够或效果差异太小增加样本量或降低结论阈值后验区间看起来异常宽αβ 太小且数据量不足检查数据量或考虑更强的有效先验用蒙特卡洛模拟时结果抖动很大采样次数不够提高样本量到 10 万以上再试两个后验均值相同但分布形态不同只是均值相同方差不同比较区间宽度勿只看均值6.5 数值稳定性的一个提醒在实际计算中直接算 Gamma 函数比值在高参数时可能溢出。更稳妥的做法是用对数 Gammascipy.special.gammaln先算对数归一化常数再指数化。虽然现代库已经优化了很多但这个习惯能帮你避开一些极端先验下的坑。我在做高风险参数评估时一般会写一个log_beta_pdf的辅助函数调试起来更安心。最后再分享一个经验共轭性这层关系理解框架比背诵推导更重要。你只要记住“先验与似然形式兼容后验归属同一家族”这一句话以后遇到 Poisson–Gamma、Multinomial–Dirichlet 这类共轭对都能快速迁移参数更新无非就是把观测计数加到先验计数的对应位置上。我是全靠这个习惯在工作里省下大量计算时间的。