ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

贝叶斯统计核心:Beta分布与二项分布的共轭先验详解

贝叶斯统计核心:Beta分布与二项分布的共轭先验详解 二项分布和Beta分布之间的共轭关系是贝叶斯统计入门时一道绕不过去的坎。很多教材和课程都会告诉你Beta分布是二项分布的共轭先验但往往只给一个结论就完了。我当初学的时候就很困惑共轭到底是什么意思为什么偏偏是Beta分布这个共轭对我的实际分析有什么帮助如果你也有同样的疑问这篇文章正好可以帮你彻底打通这块知识不仅把共轭性的数学证明完整走一遍还会把两个分布的参数含义掰开揉碎讲清楚最后再分享一些我在实际项目里用这组共轭关系的经验和容易踩的坑。这篇文章适合正在学贝叶斯统计的学生、做数据分析想要搭建贝叶斯模型的朋友或者对概率建模有兴趣、想加深理解的开发者。我会从共轭先验的核心思想讲起逐步推进到具体的公式推导最后落到实际应用层面让不熟悉公式推导的读者也能跟上节奏。1. 共轭先验到底在说什么从贝叶斯更新的视角看问题理解共轭关系之前得先回到贝叶斯公式本身。贝叶斯定理的核心思想是当我们观察到数据之后对某个未知参数的信念要从先验分布更新到后验分布。公式写出来就是P(θ|Data) P(Data|θ) * P(θ) / P(Data)其中P(θ)是看到数据之前对参数θ的认知P(Data|θ)是似然函数P(θ|Data)是看到数据之后对θ的更新认知。问题出在分母P(Data)上。这个量需要对θ做积分也就是P(Data) ∫ P(Data|θ) * P(θ) dθ。在很多实际问题里这个积分不是随便就能算出来的甚至可能根本算不出解析解这就是贝叶斯统计历史上长期被诟病计算太复杂的原因之一。共轭先验的出现恰好把这个问题绕过去了。如果先验分布和似然函数在数学形式上搭配得刚好那么后验分布会和先验分布属于同一个分布族只不过参数被数据更新了。换句话说你选了Beta分布做先验算完贝叶斯公式之后发现后验还是Beta分布只是参数从(α, β)变成了(αk, βn-k)。这样分母那个积分就不需要显式计算了因为后验分布的归一化常数可以由Beta分布的核直接确定。我打个比方帮大家理解。假设你要判断一枚硬币是否公平θ表示正面朝上的概率。你一开始认为θ大概在0.5附近就用一个Beta(2, 2)来描述这种有点不确定但偏中间的感觉。然后你抛了10次硬币得到7次正面。共轭性告诉你你的新信念直接就是Beta(27, 23) Beta(9, 5)。整个过程不需要任何数值积分不需要MCMC采样手算就能得到精确的后验。这种性质在实际分析中相当实用尤其当数据是流式到达的时候。比如A/B测试中用户一个个进来每来一个用户你就想更新一次对转化率的估计。如果每次都用共轭关系做更新那计算开销几乎为零随时都能报告当前的后验分布。值得注意的是共轭性的本质是一种巧妙的搭配而不是什么神秘力量。Beta分布的公式里恰好含有θ^(α-1)(1-θ)^(β-1)二项分布的似然里恰好含有θ^k(1-θ)^(n-k)两者乘在一起指数直接相加自然就还是Beta分布的形式。这种结构上的天然契合就是共轭关系能够成立的数学根源。2. Beta分布与二项分布的参数逐项对应形状参数、伪计数与直觉想要真正理解共轭性光知道后验还是Beta分布不够还得搞清楚参数变动背后的含义。Beta分布通常写成Beta(α, β)其中α和β都大于0。很多人第一次看到这个分布时不知道α和β到底代表什么甚至会把它们和二项分布里的成功次数、失败次数直接划等号。这个理解方向对了一半但不够准确里面有一些细节值得展开。Beta分布的概率密度函数是f(θ; α, β) θ^(α-1) * (1-θ)^(β-1) / B(α, β)其中B(α, β)是Beta函数B(α, β) Γ(α)Γ(β) / Γ(αβ)它在这里的作用是归一化常数保证密度函数的积分等于1。先说α和β的直觉含义。最常见、也最实用的理解是α可以看作虚拟的成功次数β可以看作虚拟的失败次数。所谓虚拟是说在真正做实验之前你心里已经预设了相当于α次成功、β次失败的先验信息。比如你设Beta(5, 5)相当于你事先认为这枚硬币大概在10次实验中会得到5次正面而且你对自己这个判断的把握程度相当于做过10次实验。这个解释初看有点绕但配合均值公式就清晰了。Beta分布的均值是α/(αβ)你做最大后验估计时的点估计通常就是(αk)/(αβn)其中k是实际观测到的成功次数n是总实验次数。分子分母同时包含虚拟计数和真实计数这完全符合用事前信息加事后数据共同决定最终判断的贝叶斯精神。接下来看两个参数的相对大小和绝对大小分别影响什么。α/(αβ)决定分布的中心位置也就是你对θ最可能的取值估计αβ决定分布的集中程度这个值越大分布越尖锐说明你对θ的把握越强。换句话说α/(αβ)是你觉得θ大概是多少αβ是你有多确定。这个区分特别重要因为很多人只关注前一项忽略了后一项带来的信息量差异。我举一个具体的数值例子来展示这个差别。Beta(2, 8)和Beta(20, 80)的均值都是0.2但前者αβ10分布比较宽后者αβ100分布很窄。如果你用这两个先验分别做推断面对同样的10次实验数据后验分布的形状差别会很明显。Beta(2, 8)的后验更容易被数据说服因为它本身对自己的先验判断就不太坚定Beta(20, 80)则相对固执因为它的先验信息相当于做了100次实验10个真实数据点很难动摇它。这个特性在实际业务中非常有用。假设你在做一个新产品的付费转化率预估团队里有人对这个产品非常有信心认为转化率应该在25%左右。你可以用Beta(25, 75)来描述这种乐观预期因为它不仅表达了均值25%还表达了这个判断很确定的态度。另一个成员比较谨慎认为转化率可能浮动很大只用Beta(2, 6)均值同样是25%但方差大得多。两个先验在相同数据下得到的后验会相差很多这种差异本质上就是在量化不同决策者的先验信念强度。最后再补充一个容易误解的点Beta分布的α和β并不要求是整数它们可以是任意正实数。比如Beta(0.5, 0.5)是Jeffreys先验的一种它把更多的概率质量推向0和1两端代表一种极端值也可能出现的先验态度。实际使用中如果你对参数完全没有先验信息可以选Beta(1, 1)也就是[0,1]上的均匀分布它表示所有θ取值等可能。这些非整数的参数选择在共轭更新的过程中同样成立后验参数就是α加成功次数、β加失败次数即使α和β是小数也完全没问题。3. 共轭性证明的完整推导从贝叶斯公式到Beta后验的每一步现在进入本文的核心部分完整证明Beta分布是二项分布的共轭先验。我会采用两种路径来证明一种是正规的、连归一化常数一起推导的严格证法另一种是只关注核的快速证法。两条路线各有优势放在一起看能让理解更透彻。3.1 准备工作二项分布的似然函数假设我们进行了n次独立重复实验每次实验成功的概率为θ观测到了k次成功。二项分布的似然函数是P(Data|θ) C(n, k) * θ^k * (1-θ)^(n-k)其中C(n, k)是组合数它在这里是k的函数和θ无关。这个和θ无关的细节很重要因为后面的推导中所有不包含θ的常数都可以被吸收到归一化系数里。同时我们假设先验分布是Beta(α, β)P(θ) θ^(α-1) * (1-θ)^(β-1) / B(α, β)3.2 严格证法把分母积分算出来贝叶斯公式写成P(θ|Data) P(Data|θ) * P(θ) / P(Data)先看分子。把似然和先验直接相乘P(Data|θ) * P(θ) [C(n, k) * θ^k * (1-θ)^(n-k)] * [θ^(α-1) * (1-θ)^(β-1) / B(α, β)]把同底数的幂合并θ的指数变成kα-1(1-θ)的指数变成n-kβ-1P(Data|θ) * P(θ) [C(n, k) / B(α, β)] * θ^(αk-1) * (1-θ)^(βn-k-1)这个形式已经非常接近Beta分布了。现在处理分母。P(Data)需要通过积分求出来P(Data) ∫ P(Data|θ) * P(θ) dθ [C(n, k) / B(α, β)] * ∫ θ^(αk-1) * (1-θ)^(βn-k-1) dθ对[0,1]区间上的这个积分回忆一下Beta函数的定义积分∫_0^1 θ^(x-1)(1-θ)^(y-1)dθ正好等于B(x, y)。所以上面这个积分的结果直接就是∫ θ^(αk-1) * (1-θ)^(βn-k-1) dθ B(αk, βn-k)于是分母变成P(Data) [C(n, k) / B(α, β)] * B(αk, βn-k)把这个结果代回贝叶斯公式分子分母中的C(n,k)/B(α,β)直接约掉P(θ|Data) [C(n,k)/B(α,β) * θ^(αk-1)(1-θ)^(βn-k-1)] / [C(n,k)/B(α,β) * B(αk, βn-k)]简化之后得到P(θ|Data) θ^(αk-1) * (1-θ)^(βn-k-1) / B(αk, βn-k)右边正好是Beta(αk, βn-k)的概率密度函数。严格证明完成。在这个推导中真正关键的一步是识别出那个积分就是Beta函数。一旦认出这一点整个证明就水到渠成了。3.3 核方法不写分母也能看出共轭性如果只需要快速判断一个先验是否共轭可以完全不碰积分。所谓核就是概率密度函数中除去归一化常数后剩下的、能决定分布形状的部分。Beta分布的核是θ^(α-1)(1-θ)^(β-1)二项分布似然的核是θ^k(1-θ)^(n-k)。两者相乘指数相加得到θ^(αk-1)(1-θ)^(βn-k-1)这个形式一看就是Beta分布家族的核。这套只看核不看归一化常数的思路在工作效率上有实际价值。我做贝叶斯模型设计时判断一个先验是否共轭从来不会先去算那个复杂的积分而是先在草稿纸上把核乘一下试试。如果乘完指数刚好能落回同一个分布族的核形式再确认归一化常数基本上就十拿九稳了。事实上指数族分布和其共轭先验之间的这种核相乘仍为同一形式的关系是统计学里一个更普遍的结论。两种证明方法各有适用场景。严格证法适合写论文、写技术报告需要保证每一步都有据可查核方法适合日常工作思路快、效率高也更容易看出为什么共轭关系存在。3.4 也不要忽视的归一化系数变化共轭性成立不代表归一化常数不重要。虽然我们可以通过核的形式判断分布族但要实际计算概率值、分位数、可信区间还是需要正确的归一化常数。Beta函数B(αk, βn-k)的计算可以通过伽马函数来算B(αk, βn-k) Γ(αk) * Γ(βn-k) / Γ(αβn)如果α和β都是整数那Γ函数就是阶乘的推广可以直接手算如果α和β是小数通常用统计软件或数值库来算就行。Python里SciPy提供了beta函数R里也有内置的beta函数这些工具在实现贝叶斯更新时都很顺手。4. 参数更新规则与序贯贝叶斯思想为什么这个性质在实际应用中这么香共轭性带来的一个直接好处就是可以极其方便地实现序贯更新。序贯贝叶斯思想的本质是昨天的后验就是今天的先验。这句话听起来简单但没有共轭性的话每次更新都要重新做一次积分而且后验的分布族每次可能都不一样计算复杂度会快速失控。有了共轭性整个更新过程变成纯粹的参数累加这是计算上的质变。假设你在监测一个网站注册页面的转化率。早上开始时有先验Beta(1, 1)。第1个小时来了50个访客其中8人注册那后验就是Beta(18, 142) Beta(9, 43)。第2个小时又来了60个访客12人注册这时不需要回到最初的先验重新算直接把上一轮的Beta(9, 43)当先验更新成Beta(912, 4348) Beta(21, 91)。如果你愿意也可以直接从Beta(1,1)开始把所有数据一次性算完Beta(1812, 14248) Beta(21, 91)。两种方式结果完全一致这就是序贯更新和批量更新在共轭情形的等价性。这个等价性还能推广到更多场景即使你中途加入观测或者把数据分成几批分别处理只要所有观测都服从同一个二项过程最终后验都一样。这给工程实现带来很大灵活性特别是数据以流式方式到达、无法一次性获取全部数据时共轭更新几乎是唯一不需要近似计算的办法。序贯更新在实际产品中有很多应用。比如推荐系统里要实时估计某个商品点击率的区间每来一次曝光和点击就更新一次后验参数再比如风控系统中监控某个渠道的欺诈率每天更新一次Beta分布参数。这些场景数据量不一定大但要求延迟低、计算快共轭性正好满足需求。再深入一层共轭更新还能帮你压缩数据。如果你只想向同事汇报核心信息不需要把所有原始数据都给他只要把后验参数和总样本量告诉他对方就能还原整个后验分布。像是你用Beta(α, β)做后验你可以这样告诉对方我现在的估计等价于一个αβ次实验中成功α次的完整数据记录。这种表达在团队协作时很实用信息传递密度高且不失真。此外共轭更新为推导可信区间提供了便利。后验Beta(α, β)的可信区间可以通过Beta分布的分位数函数直接计算比如90%的可信区间就是Beta分布的5%和95%分位点。SciPy中stats.beta.ppf函数可以直接算from scipy import stats alpha, beta 21, 91 lower stats.beta.ppf(0.05, alpha, beta) upper stats.beta.ppf(0.95, alpha, beta) print(f90% credible interval: [{lower:.4f}, {upper:.4f}])输出结果会告诉你当前转化率的90%可信区间大致落在哪个范围内。这个能力在实际汇报中相当好用比起只给一个点估计给出区间更能体现不确定性。5. 共轭先验在实际建模中的选参策略与常见误区前面几节把理论框架搭起来了这一节说说实际操作中怎么选α和β。这部分内容很多教材不讲但实际做项目时几乎一定会遇到。先解决最基础的问题没有任何历史信息时选什么先验标准答案通常是Beta(1, 1)也就是均匀分布。它的好处是完全无信息后验完全由数据驱动。不过严格来说Beta(1, 1)并不真的是无信息它只是均匀地分配概率质量而已。如果你真的一点概念都没有也可以考虑Beta(0.5, 0.5)也就是Jeffreys先验它在参数变换下具有不变性在理论上有更优的性质。但从实际使用的角度Beta(1, 1)更直观、更好解释大多数场合完全够用。当你有一些历史数据时问题就变成如何把历史信息折算成虚拟计数。一个实用的做法是用历史数据的成功次数和失败次数直接作为α和β。比如你之前做过100次实验成功了30次那先验就设Beta(30, 70)。这种方法叫经验贝叶斯简单粗暴但效果不差。唯一需要注意的是如果你把历史数据全算进先验然后又用这批数据去更新数据会被重复使用导致后验过于自信。正确的做法是历史数据只用来定先验更新用的必须是新数据。如果你不仅知道历史比例还想控制先验的强度可以引入一个等效样本量的概念。假设你估计转化率大概在20%但你对这个估计不是特别确定觉得等效于20次实验的信息量那α和β分别取200.24和200.816就是Beta(4, 16)。等效样本量取得越大先验越强数据越难改变初始观点。这个参数完全取决于你的主观信心没有标准答案需要根据业务场景自行判断。在有强先验信息时还需要警惕先验主导数据的风险。假设你设了Beta(1000, 4000)均值20%等效样本量5000。如果接下来只跑了50个真实用户样本无论数据怎么说后验都会被先验牢牢按住。这在某些领域是好事比如你有大量可靠的历史数据但在快速变化的环境里可能是坏事比如产品刚做了大改版老数据其实不能代表新版本的真实表现。我的建议是如果预期环境可能发生变化把历史数据的等效样本量适当打折比如只取实际样本量的20%-50%给新数据留出调整空间。除了参数选择使用Beta先验时还有几个容易踩的坑。第一个坑是混淆先验均值和后验均值。公式E[θ] α/(αβ)只是先验均值后验均值是(αk)/(αβn)。但如果你把后验均值当成了真实转化率的估计边际风险不是均值的偏差而是忽略了不确定性。后验均值确实是最常见的点估计但做决策时一定要连同后验区间一起看否则可能被单一数值误导。第二个坑是忘了数据生成过程是否符合二项分布假设。共轭性的前提是n次独立同分布实验每次成功概率相同。如果你的数据存在相关性比如同一个用户被重复统计或者转化率本身随时间漂移二项分布假设就不成立了共轭更新算出来的后验再漂亮也不能反映真实世界。第三个坑和数值实现有关。当α和β很大时比如超过10000直接计算Gamma函数可能出现数值溢出。实际操作中我通常用日志空间处理这些计算。Python的scipy.special提供了gammaln函数可以在对数空间做计算避免精度问题from scipy.special import gammaln from scipy.stats import beta alpha, beta_param 12345, 67890 mean alpha / (alpha beta_param) log_prob beta.logpdf(0.25, alpha, beta_param)对数空间运算是处理极端参数时的常规手段可以省去很多不必要的精度烦恼。第四个坑是非整数参数的理解偏差。虽然Beta(α, β)对非整数α、β完全有效但如果你习惯了虚拟成功次数这个直觉遇到Beta(0.5, 0.5)就容易困惑失败次数0.5是什么意思其实这里的0.5只是数学上的形状参数不需要直观化成半个实验结果。把α和β理解成分布的形状态而不是字面意义的虚拟计数能避免不少思维上的别扭。当αk和βn-k中出现小数时后验分布依然是合法、完善的Beta分布照样可以算均值和分位数只是虚拟计数这个直观解释的边界感会更模糊一些。6. 从二项Beta共轭到更广的共轭家族给进阶者的扩展地图如果你已经掌握了二项分布和Beta分布的共轭关系可以顺着这套逻辑延伸到其他共轭族。理解了这一个案例再去看其他的共轭关系会发现规律是相通的本质上就是指数族分布与对应先验在核相乘时的封闭性。最常见的扩展是泊松分布与Gamma分布之间的共轭。泊松分布的参数λ描述的是单位时间内的平均发生率它的似然核是λ^k * e^(-nλ)而Gamma分布的核是λ^(α-1) * e^(-βλ)。相乘之后得到λ^(αk-1) * e^(-(βn)λ)仍然是Gamma分布的核后验就是Gamma(αk, βn)。这套共轭关系在排队论、故障率分析、点击流建模里都有广泛应用。另一个经典组合是正态分布均值的共轭先验。当数据服从已知方差的正态分布时均值的共轭先验是正态分布。先验N(μ0, σ0²)观测到n个样本均值为x̄后验均值是加权平均μ_post (σ0²/(σ0²/n σ0²)) * x̄ ((σ0²/n)/(σ0²/n σ0²)) * μ0这个公式形式上看就是先验均值和样本均值的加权组合权重取决于两者的方差。方差小的一方权重更大这是贝叶斯更新中谁更确定听谁的思想的一个典型例证。还有一个不可不提的案例是多项分布与Dirichlet分布的共轭关系。Dirichlet分布是Beta分布在多维情形的推广参数从(α, β)扩展为(α1, α2, ..., αk)随机变量也从单个θ扩展为一个概率向量(θ1, θ2, ..., θk)。多项分布的计数数据更新Dirichlet先验时只需要把对应的αj加上各类别的观测计数更新规则和二项情形如出一辙。自然语言处理中文本主题模型的基础——LDA模型其核心推断就用到了这层共轭关系。理解了二项Beta共轭再去看Dirichlet多项共轭会发现几乎是无缝切换唯一需要适应的是从单维参数空间到多维参数空间的维度增长。在工程实现上如果你用的是PyMC或Stan这类概率编程工具虽然MCMC自动帮你做了后验采样不一定需要共轭先验来加速但理解了共轭性依然有帮助。比如当你想知道一个模型为什么在某个参数上收敛略慢时共轭性的视角会告诉你先验的形状参数是否和数据信息量匹配是否因为先验太过分散导致采样效率下降。我自己在调试贝叶斯模型时经常先用共轭性手动算一遍常见简单参数的解析后验和MCMC采样结果做交叉验证。如果两者对不上往往是采样器有问题或者马尔可夫链还没跑够。这个验证技巧能帮我提前发现不少模型隐患。7. 一个实战案例用Beta二项共轭做A/B测试实时监测理论讲了不少最后用一个我在实际项目中常遇到的场景来串联前面所有内容。假设你在做A/B测试对照组和实验组的转化率都是未知参数你想实时监测实验组是否显著优于对照组。传统频率派的做法是等样本量足够后做一次假设检验中间过程不能调整实验策略。而用共轭贝叶斯方法你可以随时查看两个组的后验分布看实验组转化率后验均值比对照组高出多少以及这个差值的可信区间是否已经排除了0。具体做法是每个组各自设定先验Beta(1, 1)然后每来一批数据就把计数累加到对应的参数上。对照组得到后验Beta(α_c k_c, β_c n_c - k_c)实验组得到Beta(α_t k_t, β_t n_t - k_t)。每一步都能计算出后验转化率的均值差异及其分布import numpy as np from scipy import stats def prob_b_beats_a(alpha_a, beta_a, alpha_b, beta_b, n_samples200000): samples_a np.random.beta(alpha_a, beta_a, n_samples) samples_b np.random.beta(alpha_b, beta_b, n_samples) return np.mean(samples_b samples_a) # 模拟数据对照组2000人转化180人实验组2100人转化230人 alpha_a, beta_a 1 180, 1 2000 - 180 alpha_b, beta_b 1 230, 1 2100 - 230 prob prob_b_beats_a(alpha_a, beta_a, alpha_b, beta_b) print(fP(实验组 对照组) {prob:.3f})当这个概率超过95%时可以认为实验组显著优于对照组。这套方法的优势在于随时可看、随时可停不依赖固定样本量计算。而且因为每一步计算量极小完全可以做成实时仪表盘每进来一批数据刷新一次。当然这个方法也有局限性。如果提前设置停止规则并且反复查看严格来说会存在连续监测带来的偏差。但从工程角度看它的实用性依然是很多团队选择它的理由。如果你追求严格性可以把决策阈值和查看次数的关系通过模拟或校正机制更精细地控制这就属于更进阶的话题了。我在实际使用这套方法时还会额外关注一个指标两个后验分布的重叠面积。这个指标能从另一个角度量化差异的显著程度比如两个分布几乎完全重叠时均值差异虽然存在但其实没有太多信息量。用Beta分布的采样实现起来也很直观把上面代码里P(BA)的计算稍微改一下统计两组样本差值落入某个区间内的比例就行。从理论证明到实际应用二项Beta共轭这条线串下来是贝叶斯统计中少有的兼具优雅和实用性质的内容。它不一定能解决世界上最复杂的推断问题但绝对是理解贝叶斯更新机制、搭建实时估计系统的第一块基石。如果你刚接触贝叶斯方法把这一对共轭关系彻底吃透后面学再复杂的模型心里都有底。
返回列表