
Beta分布练习题这个说法听起来像教辅书后面附答案的那种一页纸练习可真正带着人从零做一遍你会发现它其实是贝叶斯入门里性价比最高的一组训练。它不考你背公式考的是你能不能把先验、似然、后验、预测这条链条完整地走通一遍并且用手算和代码两条路径互相校验。这套练习题能解决的问题很具体很多人看完贝叶斯公式知道 P(θ|D) 正比于 P(D|θ)P(θ)但给他一枚来路不明的硬币、二十次投掷记录他还是不知道该写什么先验、算出来的后验长什么样、那个区间到底能不能说θ 有 95% 的概率落在里面。这套题就是拿来补这个缺口的。适合谁呢有一点概率基础、能看懂积分符号但不要求熟练、写过几十行 Python 的人最合适。纯小白也能跟我会把每个符号的含义都摊开讲有点基础的人可以跳过第二章直接做题组。1. 先搞清楚这道练习题的真实训练目标1.1 为什么入门贝叶斯要拿 Beta 分布开刀贝叶斯推断的完整流程是设定先验、写出似然、求后验、做预测、做决策这五步在任何模型里都一样。问题是如果一上来就用正态-正态或者回归模型光是矩阵求导和数值采样就能把人劝退你根本没机会体会后验是怎么被数据推动的这个核心直觉。Beta 分布恰好把这件事压缩到了极致它的支撑集是 [0,1]天然对应某个比例或概率参数只有两个共轭结构让后验有闭式解你甚至可以在纸上把后验参数算出来。更关键的是Beta 分布是贝叶斯教学里少有的全流程都能手算的分布。先验是 Beta观测是二项或伯努利后验还是 Beta参数更新规则简单到可以口算成功的次数加到第一个参数上失败的次数加到第二个参数上。这个过程没有任何黑箱你能清清楚楚看到每一个观测是怎么改变信念的。等你把这套流程走熟了再去看那些需要 MCMC 采样的模型就会明白采样只是在无法解析求解时的替代手段而不是贝叶斯本身。我在带人练习时有一个固定做法先让他用铅笔算一遍再让他写代码验证一遍两次结果对不上就逐行排查。绝大多数人卡住的地方不是数学而是口径——把正面记成了失败、把先验强度当成了观测数、把 α 和 β 的顺序写反。这些错误只有亲手算过才会长记性光看别人的推导是学不会的。1.2 一道题背后藏着五个必须掌握的动作表面上看一道 Beta 分布练习题就是给先验、给数据、求后验三行就完了。但拆开来看它其实逼着你完成五个动作每一个都是后续学习的必备技能。第一个动作是参数语义映射。你得决定 α 对应成功还是失败得说清楚 θ 是正面的概率还是反面的概率。这个决定一旦做错后面所有数字都会反过来而且因为 Beta 分布对 α、β 不对称你很难从结果上看出错误。第二个动作是共轭更新把观测到的成功数和失败数分别加到先验参数上得到后验参数。第三个动作是点估计与区间估计从后验里算出均值、中位数、众数再算可信区间。这里有个坑后验均值、中位数、众数在偏态分布下并不相等选哪个取决于你的损失函数不是随便挑一个就行。第四个动作是后验预测问下一次投掷出正面的概率是多少答案恰好等于后验均值这个巧合背后是 Beta-Bernoulli 的结构值得单独推一遍。第五个动作是先验敏感性分析换几组不同的先验看后验被拉动多少。这一步最容易被跳过但它恰恰是贝叶斯方法最需要被审视的地方——你的结论到底是数据说的还是先验说的把这五个动作串起来一道题就变成了一个完整的小型推断项目。这也是我坚持让学生一题多问的原因只求后验参数太浅问到区间和预测才算摸到边。1.3 练习题的知识点覆盖与难度分层我在设计题组时会刻意做出梯度让做题的人能感知到自己卡在哪一层。下面这张表是我常用的一份分层清单你可以对照着自测。层级典型问法考察核心建议用时卡住的常见原因入门给定先验和数据写出后验参数共轭更新规则5 分钟α、β 与成功失败的对应关系搞反基础求后验均值、方差、众数分布矩公式10 分钟众数公式在 α1 时分母失效基础求 95% 可信区间分位数与不完全 Beta 函数15 分钟把可信区间解释成频率区间中等求下一次投掷为正面的概率后验预测分布10 分钟忘了要对 θ 积分中等求 n 次投掷中 k 次成功的概率Beta-二项分布15 分钟组合数系数漏乘进阶比较两组转化的后验差异两个 Beta 的比较20 分钟试图找解析解进阶换三组先验做敏感性分析先验强度与收缩20 分钟把等效样本量当成真实样本挑战设计一个停止规则并评估其偏差可选停止问题40 分钟忽略了停止规则对后验的影响这张表的价值不在于难度标签而在于卡住的常见原因那一列。我在实际带练时发现同一层级的人犯的错高度雷同把这些雷区提前标出来能省掉大量来回。2. Beta 分布本身把参数语义吃透再动笔2.1 密度函数与那个绕不开的归一化常数Beta 分布的概率密度写成这样对 x 属于 [0,1]有 f(x; α, β) x^(α-1) (1-x)^(β-1) / B(α, β)其中 B(α, β) Γ(α)Γ(β)/Γ(αβ) 是 Beta 函数。很多练习题只让人算后验参数从来不碰这个常数导致一个后果做题的人以为 Beta 函数是个无关紧要的装饰。实际上这个常数是整件事的核心。你看似然的形状——θ 的 s 次方乘以 (1-θ) 的 f 次方再看先验的形状——θ 的 (α-1) 次方乘以 (1-θ) 的 (β-1) 次方两者相乘指数直接相加得到 θ 的 (αs-1) 次方乘以 (1-θ) 的 (βf-1) 次方。这个结果和 Beta 分布的核长得一模一样只是参数变成了 αs 和 βf。于是归一化常数自动跟着变你不需要做任何积分。这就是共轭的实质先验和似然属于同一个函数族相乘之后族不变只是参数平移。B(α, β) 在推导中从头到尾没有出现过但它的存在保证了整个式子能积分为 1也保证了后验是一个合法的分布。我做练习时有个习惯每算完一次后验就用 B 函数验一下归一化或者用代码跑一下beta.pdf的积分是不是等于 1这个动作能抓出大部分代数错误。顺带说一个容易混淆的点B(α, β) 里的 B 是 Beta 函数和 Beta 分布不是一个东西前者是一个积分值后者是一个分布。写推导的时候最好把 Beta 函数写成 Β(α, β) 或者直接写积分形式避免自己看花眼。2.2 均值、方差、众数三个最常被算错的量后验参数算出来只是第一步接下来要把它们翻译成能说话的数字。均值是 α/(αβ)方差是 αβ/[(αβ)²(αβ1)]众数是 (α-1)/(αβ-2)但最后这个公式只在 α1 且 β1 时成立。先说均值。它有一个非常好用的解释把 α 看成虚拟的成功次数β 看成虚拟的失败次数那么均值就是虚拟成功占虚拟总次数的比例也就是先验的事前信念。后验里这两个数字各自加上了真实的成功和失败次数均值自然就变成了虚拟次数加真实次数的加权比例。这个解释让你不用记公式也能口算出后验均值。方差公式里那个 (αβ1) 是关键它说明随着总参数增大方差会快速收缩。当 αβ 从 4 涨到 24方差大概会掉到原来的十分之一量级标准差掉到三分之一左右。这解释了为什么数据一多后验就变得又窄又尖先验的影响被稀释。众数是最容易翻车的一个。αβ1 时分布是均匀的每个点的密度都一样众数根本没有唯一定义α1 或 β1 时密度在边界发散众数跑到 0 或 1 上去了那个公式算出来是负数或者大于 1 的怪值。我在练习题里专门放了一道 α0.5、β0.5 的题就是为了让人亲眼看到公式失效。这道题的标准答案不是算出某个数而是指出众数不唯一或位于边界。顺带提一下中位数。它没有闭式解得靠数值方法求但它在偏态分布下比均值更稳健。如果你要做的是最可能的值是多少这类问题中位数往往比均值更合适。练习题里我一般要求三个都算然后比较差异差异大的时候正好可以讲偏态。2.3 α、β 的六种形态与等效样本量直觉光记公式不够你得对参数形状有感觉。我把常见的参数组合整理成了下面这张表做题时对照着看能快速判断后验大概长什么样。参数组合分布形态直觉含义典型用途α1, β1均匀分布完全不知道任何比例等可能无信息先验的入门选择αβ0.5U 形双峰认为答案趋近 0 或 1中间地带不太可能极端稀疏场景的弱信息先验α2, β2单峰中心在 0.5温和地相信结果接近一半轻微正则化的默认选择α8, β2单峰中心在 0.8相信大概率成功强度相当于 10 次观测有历史数据的场景α1, β3单调下降相信大概率失败已知基线很低的转化率α20, β20很窄的单峰非常确信就在 0.5 附近强先验需要大量数据才能撼动表里最值得琢磨的是等效样本量这个概念也就是 αβ。Beta(8,2) 的等效样本量是 10意思是这个先验在信息量上大致相当于你已经看过 10 次投掷、其中 8 次成功。这个类比不严谨但在实际沟通中极其好用。当你需要向别人解释为什么我加了先验之后结论变了直接说我相当于额外看了 10 条数据比讲一堆公式有效得多。有了这个直觉先验强度的选择就有了抓手。如果你的真实数据只有 5 条却用了等效样本量 20 的先验那后验基本由先验说了算数据几乎没话语权这种情况在练习题里我称之为先验淹没数据。反过来如果先验强度只有 2、数据有 200 条那先验怎么选都无所谓后验几乎相同。这两个极端场景都值得亲手跑一遍跑完你对先验什么时候重要这个问题就有肌肉记忆了。2.4 和 Gamma、二项、Dirichlet 的血缘关系Beta 分布不是孤立的它周围站着一圈亲戚搞清楚这层关系很多公式就不用死记了。最直接的关系是如果 X 服从 Gamma(α, 1)Y 服从 Gamma(β, 1)且两者独立那么 X/(XY) 服从 Beta(α, β)。这条性质解释了为什么 Beta 分布天然适合建模比例——比例本质上就是两个非负量相除。它也顺带说明了 Beta 分布为什么定义在 [0,1] 上。第二个关系是共轭配对Beta 是二项分布和伯努利分布的共轭先验。这个配对是练习题的主战场前面已经讲过。第三个关系是 Dirichlet 分布。Dirichlet 是 Beta 在多类别情形下的推广Beta 是 Dirichlet 在二类别时的特例也就是 Dirichlet(α, β) 的第一个分量。这条关系很重要因为它意味着你在 Beta 上练熟的所有动作——先验设定、后验更新、可信区间、后验预测——都能原样搬到多类别占比的问题上比如用户点击了五个不同按钮中的哪一个。练习题做到后面我会让人把二项的情形手动扩展到三类体会一下 Dirichlet 的参数是一个向量而不是两个数。还有一条经常被忽略的性质Beta 分布的累积分布函数就是正则化不完全 Beta 函数 I_x(α, β)。求可信区间本质上就是解 I_x(α, β) 0.025 和 0.975这是个没有闭式解的方程必须数值求解。练习题里我要求大家至少手写一次二分法求分位数就是为了让你知道beta.ppf背后在干什么而不是把它当魔法。3. 题组设计从单点计算到完整推理链3.1 第一组先验到后验的纯手工推导这一组是热身目标是让参数更新变成条件反射。题目形式统一给一个先验 Beta(α₀, β₀)给一串观测结果要求写出后验的参数、均值、标准差。我选的第一道是某台设备每次运行有固定但未知的合格率 θ先验取 Beta(2, 2)跑了 20 次14 次合格、6 次不合格。后验参数是 Beta(16, 8)。后验均值是 16/24约等于 0.667。样本频率是 14/20 0.7先验均值是 0.5后验均值落在两者之间而且更靠近样本频率因为数据的权重 20 远大于先验的等效样本量 4。用加权平均的视角验算一遍(4×0.5 20×0.7)/24 (214)/24 0.667和直接算一模一样。这个验算动作我要求每道题都做因为它同时检验了后验参数和均值两个环节。方差算出来是 16×8/(24²×25) 128/14400约 0.0089标准差约 0.094。这个数字的含义是后验的标准差大约 9.4 个百分点也就是你对 θ 的估计还有将近十分之一的不确定性。20 条数据只能把你的认知收窄到这种程度这个量级很多人第一次算的时候会感到意外。这一组还会放一道反向题已知后验是 Beta(9, 6)观测是 7 次成功 4 次失败问先验是什么。答案是 Beta(2, 2)。反向题的价值在于它逼着你把更新规则当成一个可逆的映射来理解而不是单向的加法。3.2 第二组区间估计与 HPD 的差别算出点估计之后下一个问题是不确定性有多大。95% 可信区间的定义是后验分布中集中了 95% 概率的区间。注意这里的主语是θ 的概率不是重复实验的覆盖率这个区别是贝叶斯和频率学派最直观的分水岭我在练习题里会反复强调。最常用的做法是等尾区间取 2.5% 和 97.5% 两个分位数。用代码算一行beta.ppf([0.025, 0.975], 16, 8)就出来了我这边跑出来的量级大致是 0.49 到 0.83 之间。手算的话得用数值方法练习题要求至少用二分法求一次下界精确到小数点后两位即可。麻烦的地方在于等尾区间在偏态分布下并不是最短的。HPD 区间最高后验密度区间的定义是区间内每个点的密度都不低于区间外任何一点的密度换句话说它是把概率最集中的那一块切出来。做法是找两个点 a、b使得 f(a)f(b) 且区间内的概率正好是 95%。对 Beta(16, 8) 这种左偏的分布HPD 区间会比等尾区间窄一些两端都往众数方向收。为什么因为左尾更长更薄等尾区间为了凑够左边的 2.5% 概率不得不往很低密度的地方延伸而右边肩膀比较陡同样的 2.5% 概率只用很短的一段就够了。HPD 要求两端密度相等自然会把左端往右挪、右端也往右挪一点总宽度变小。这个差别在实际数据量小的时候特别明显。我做过一组对比同样的观测数据下样本量 5 的时候 HPD 比等尾区间窄了将近 15%样本量 200 的时候差别缩到 1% 以内。所以练习题里我要求对同一个后验同时算两种区间然后解释差异来源。很多人算完之后才第一次真正理解为什么偏态分布要用 HPD。3.3 第三组后验预测与 Beta-二项分布点估计和区间都是在问参数是多少后验预测是在问下一次会发生什么。这是贝叶斯最实用的部分也是最容易做错的部分。单次预测很简单下一次成功的概率等于后验均值也就是 (αs)/(αβsf)。这个结论值得单独推一遍因为它的推导过程体现了对参数积分这个核心操作。你要算的是 P(下一次成功 | 数据) ∫ P(下一次成功 | θ) p(θ | 数据) dθ ∫ θ · p(θ | 数据) dθ而最后这个积分恰好就是后验均值。这个等式不是巧合是期望的定义。多次预测就没那么直观了。问接下来 10 次里恰好 3 次成功的概率需要用到 Beta-二项分布公式是 C(10,3) 乘以 B(α3, β7) 除以 B(α, β)。这个公式的来源是把二项似然和后验 Beta 相乘再对 θ 积分积分过程中 Beta 函数自动出现组合数系数留在外面。我在这道题上见过最多的错误是漏掉组合数系数。原因是很多人直接套用后验均值就是预测概率的直觉把每次预测当成独立事件连乘算出来的是恰好按某个顺序出现 3 次成功的概率比正确答案小了一个 C(10,3) 的因子。练习题里我专门放了一道要求同时算指定顺序和任意顺序的对比题两个答案差 120 倍算完之后基本没人会再忘。还有一个进阶问法接下来 10 次里至少 3 次成功的概率需要用 Beta-二项分布的累积分布或者把 0、1、2 次的概率加起来。这个计算用代码一行就够但手算能让你体会到 Beta-二项分布的尾部比二项分布更厚因为参数本身还有不确定性。3.4 第四组先验敏感性与等效样本量这一组是整个题组里最能体现贝叶斯思维的一环。题目设计是固定同一组观测数据换四五组不同的先验把后验结果摆在一起对比。我常用的观测数据是 3 次成功、1 次失败一共 4 条。先验分别取 Beta(1,1)、Beta(2,2)、Beta(10,10)、Beta(1,3)、Beta(0.5,0.5)。对应的后验分别是 Beta(4,2)、Beta(5,3)、Beta(13,11)、Beta(4,4)、Beta(4,2)。摆在一起看差异非常直观Beta(1,1) 和 Beta(0.5,0.5) 给出的后验均值都在 0.667 附近Beta(2,2) 给出 0.625Beta(10,10) 给出 0.542Beta(1,3) 给出 0.5。同样是3 成功 1 失败这四条数据后验均值从 0.5 到 0.667 横跨了 17 个百分点而数据本身的频率是 0.75。这组对比最想说明的事情是在小样本下先验的选择会实质性地改变结论。Beta(10,10) 的等效样本量是 20是真实数据的 5 倍所以后验被死死钉在 0.5 附近数据几乎没起作用。这不是错误而是先验强度的自然结果但你必须在报告里说清楚。敏感性分析的做法我建议量化不要只看均值。可以比较不同先验下后验均值的极差也可以算后验分布的 KL 散度还可以看 95% 区间的重叠程度。最简单的做法是画图把四五条后验密度曲线叠在一起一眼就能看出哪些几乎重合、哪些分道扬镳。还有一个配套的问题是需要多少数据才能压过先验。粗略的经验是当真实观测数达到先验等效样本量的 3 到 5 倍时先验的影响基本可以忽略。这个规律不精确但用来做快速的合理性判断足够了。练习题里我让人用同一组先验跑不同样本量的数据画出后验均值随样本量变化的曲线看着它从先验均值慢慢漂向样本频率这个过程比任何文字解释都直观。3.5 第五组两个比例的对比与决策前面四组都是单组参数这一组把问题升级到比较。场景是两个渠道各自有未知的转化率各有观测数据问渠道 A 比渠道 B 好的概率是多少。设 A 的先验是 Beta(2,2)观测 30 次成功 9 次B 的先验也是 Beta(2,2)观测 30 次成功 5 次。后验分别是 Beta(11,23) 和 Beta(7,27)。均值分别约 0.324 和 0.206。问题来了P(θ_A θ_B | 数据) 是多少这个量没有闭式解。两个 Beta 分布之差的分布不是 Beta甚至连常见的分布族都不是。唯一的办法是数值积分或者蒙特卡洛采样。蒙特卡洛的做法很朴素从两个后验里各抽十万个样本数一数有多少比例满足 θ_A θ_B。代码三行就写完了跑出来的结果稳定在 0.87 到 0.89 之间。这个数字的含义非常直白在看完数据之后你认为 A 更好的概率大概是 88%。这种表述在业务沟通中极其好用比p 值小于 0.05直观得多。数值积分的做法是算 ∫ F_A(x) f_B(x) dx其中 F_A 是 A 的后验累积分布、f_B 是 B 的后验密度。这个积分要用数值方法求代码上比采样麻烦但结果是确定的不受随机性影响。练习题要求两种方法都实现然后对比结果是否一致——这本身就是一个很好的自检手段。这一组我还会加一道决策题如果提升 A 的投入需要额外成本需要多少概率优势才值得投这个问题把统计和决策连起来了答案取决于成本收益比不是统计能单独回答的。但练习题会让人意识到贝叶斯输出的不是一个显著或不显著的二元判断而是一个可以带进决策的概率。4. 代码落地每道题的验证脚本怎么写4.1 环境与常用函数清单这套练习不需要什么重型工具Python 加上 SciPy 就够了。NumPy 负责数组和采样SciPy 的stats.beta负责密度、累积分布和分位数special里的betaln负责数值稳定的对数 Beta 函数。如果要做绘图Matplotlib 就够了。我把常用函数整理成下面这张表做题时可以直接查。需求函数注意事项后验密度beta.pdf(x, a, b)参数顺序是 a 在前 b 在后累积概率beta.cdf(x, a, b)求 P(θ ≤ x)分位数beta.ppf(q, a, b)q 是累积概率不是概率密度采样beta.rvs(a, b, sizen)记得设随机种子便于复现均值方差beta.mean(a,b)、beta.var(a,b)也可以手算验证对数 Beta 函数betaln(a, b)大参数时避免溢出对数 Gamma 函数gammaln(x)用于推导校验Beta-二项分布betabinom.pmf(k, n, a, b)参数顺序是 n 在前表里最后一行要特别注意betabinom的参数顺序是 (n, a, b)和beta的 (a, b) 不一样写混了不报错但结果全错。我第一次用的时候就栽在这上面对着结果纳闷了半小时。4.2 后验更新的最小脚本最核心的一段代码其实只有四行我建议你把它背下来做任何 Beta 分布的题都能直接套。from scipy.stats import beta a0, b0 2, 2 # 先验参数 s, f 14, 6 # 观测到的成功与失败次数 a1, b1 a0 s, b0 f # 后验参数 print(后验参数:, a1, b1) print(后验均值:, beta.mean(a1, b1)) print(后验标准差:, beta.std(a1, b1)) print(95% 等尾区间:, beta.ppf([0.025, 0.975], a1, b1))这段脚本跑出来的均值是 0.6667标准差 0.0943区间大约在 0.49 到 0.83 之间。你可以拿它和手算结果对照两个对上了说明参数映射没搞错。我建议在脚本里加一行断言把自己的手算结果写死进去做校验比如assert abs(a1 - 16) 1e-9。这个习惯在做复杂题目时能救命因为后面的区间计算、预测计算都依赖后验参数一旦这里错了后面全错而且不容易发现。再补一个众数的计算要注意条件判断def beta_mode(a, b): if a 1 and b 1: return (a - 1) / (a b - 2) elif a 1 and b 1: return 双峰边界发散 elif a 1 and b 1: return 0.0 elif a 1 and b 1: return 1.0 else: return 均匀分布众数不唯一这段代码看起来啰嗦但它把所有边界情况都覆盖了。练习题里那些 α1 的怪题用这个函数一跑就知道答案该怎么写不用现场推。4.3 区间与 HPD 的数值搜索等尾区间一行就够HPD 区间得写个小搜索。思路是在支撑集上撒一层密网格对每个左端点找到累积概率刚好多出 95% 的那个右端点算出区间宽度最后取宽度最小的那个。import numpy as np from scipy.stats import beta def hpd_beta(a, b, prob0.95, n200001): lo beta.ppf(1e-9, a, b) hi beta.ppf(1 - 1e-9, a, b) xs np.linspace(lo, hi, n) cdf beta.cdf(xs, a, b) upper_idx np.searchsorted(cdf, cdf prob) upper_idx np.clip(upper_idx, 0, n - 1) widths xs[upper_idx] - xs i np.argmin(widths) return xs[i], xs[upper_idx[i]]这段代码有两个细节值得说。一是网格范围不能直接取 0 到 1因为beta.cdf在极端参数下会在端点附近出现数值问题所以用ppf(1e-9)和ppf(1-1e-9)把范围收一收丢掉的那点概率可以忽略。二是searchsorted找到的索引可能越界必须clip一下否则参数极端时会崩。跑出来的结果我不在这里写死具体数字因为网格精度不同结果会有小差异。你在自己的机器上跑一遍和等尾区间对比宽度观察是不是更窄、两端是不是都往众数方向收了这个对比本身就是理解 HPD 最好的方式。4.4 数值稳定性log 空间与极端参数小参数的题随便算都没事参数一大就出问题。比如 α5000、β3000 的时候直接算 Γ(8000) 会直接溢出成无穷大所有结果变成 nan。这不是罕见情况做大规模 A/B 实验分析时数据动辄几十万条后验参数很容易上千。解决办法是一律在对数空间计算。Beta 函数的对数可以用betaln直接拿到密度的对数就是 (α-1)log x (β-1)log(1-x) - betaln(α, β)。如果确实需要原始密度值再取指数回来但要注意 log 值太小的时候 exp 会下溢成 0这时候就该保留对数形式继续算。from scipy.special import betaln def log_beta_pdf(x, a, b): return (a - 1) * np.log(x) (b - 1) * np.log(1 - x) - betaln(a, b)这段代码在 x 接近 0 或 1 的时候也会出问题因为 log(0) 是负无穷。实际用的时候要把 x 夹在 [eps, 1-eps] 之间或者直接判断边界情况单独处理。还有一个数值陷阱是分位数的极端取值。当 α 或 β 小于 1 的时候分布向边界发散beta.ppf(0.001, 0.5, 0.5)会给出一个非常接近 0 的数但精度会下降。练习题里我让人把 αβ0.5 的 0.1% 分位数算出来再和解析式对比这个特例恰好有解析解因为反正弦分布的累积分布是 2/π 乘以 arcsin(√x)能直观看到数值误差有多大。4.5 画图与结果呈现做贝叶斯题不画图等于白做。一张密度对比图能传达的信息比一屏数字多得多。我一般的做法是先验画一条虚线后验画一条实线两条叠在一起一眼就能看出数据把信念推动了多少。import matplotlib.pyplot as plt import numpy as np from scipy.stats import beta xs np.linspace(0, 1, 500) plt.plot(xs, beta.pdf(xs, 2, 2), --, label先验 Beta(2,2)) plt.plot(xs, beta.pdf(xs, 16, 8), -, label后验 Beta(16,8)) plt.xlabel(theta) plt.ylabel(density) plt.legend() plt.show()除了单组对比还有三种图值得画。第一种是后验均值随样本量变化的轨迹图横轴是累计观测数纵轴是后验均值你会看到它从先验均值出发逐渐被数据拉到样本频率附近前期抖动大、后期趋于平稳。第二种是不同先验下的后验叠图用来做敏感性分析。第三种是 A/B 对比时两个后验的叠图中间重叠的区域就是分不出胜负的部分配合 P(θ_A θ_B) 这个数字一起看说服力很强。画图时有个小技巧横轴范围不要一律设成 0 到 1。如果后验集中在 0.6 到 0.8 之间把横轴拉到 0 到 1 会让曲线挤成一坨什么细节都看不见。用后验的 99% 区间作为横轴范围曲线的形状才能充分展开。5. 参考答案与推导细节挑几道讲透5.1 基础题后验参数、均值、区间先完整走一遍最基础那道题先验 Beta(2,2)观测 20 次中 14 次成功、6 次失败。后验是 Beta(16,8)。后验均值 16/24约 0.6667。后验方差 16×8/(24²×25)分母是 576×2514400分子是 128结果约 0.008889标准差约 0.09428。95% 等尾区间的两个端点分别是 Beta(16,8) 的 2.5% 和 97.5% 分位数。这个没有闭式解必须数值求。我用代码跑出来的量级大约在 0.49 到 0.83 之间你可以用自己的机器验证。区间的宽度约 0.34也就是 34 个百分点对于 20 条数据来说这个宽度是合理的想要把区间压到 10 个百分点以内样本量大概得翻十倍。这里有一个值得停下来想的问题样本频率是 0.7后验均值是 0.667两者差了 3.3 个百分点这个差从哪来答案是先验的拉动。先验均值 0.5权重 4数据频率 0.7权重 20。加权下来就是 0.667。如果先验换成 Beta(1,1)后验均值会变成 15/22约 0.682离 0.7 更近。这就是敏感性分析想要展示的东西。再算一个 P(θ 0.5 | 数据)也就是看完数据之后你认为合格率超过一半的概率。用代码算1 - beta.cdf(0.5, 16, 8)跑出来大概在 0.96 到 0.97 之间。这个数字比均值是 0.667更有决策价值因为它直接回答了有多大把握说它过了一半这个问题。5.2 进阶题P(θ0.5) 与后验预测接着上一题往下问如果这台设备再跑 10 次恰好有 7 次合格的概率是多少这里要用 Beta-二项分布参数是 n10、a16、b8求 k7 的概率。公式是 C(10,7) 乘以 B(23, 11) 除以 B(16, 8)。手算 B 函数很麻烦用代码一行搞定from scipy.stats import betabinom p betabinom.pmf(7, 10, 16, 8)我这边跑出来的量级大概在 0.2 上下。作为对比如果直接用后验均值 0.667 当成真实概率算二项分布C(10,7)×0.667⁷×0.333³ 会得到一个略小的值。两者的差异来源就是参数不确定性Beta-二项分布把 θ 的不确定性也积分进去了所以分布更分散尾部更厚。这个对比特别适合讲清楚一件事为什么不能把点估计当成真值代进下游计算。点估计只是一个摘要它丢掉了不确定性信息凡是涉及未来会怎样的问题都得用完整的后验分布去做积分而不是拿均值顶替。再补一个问法接下来 10 次里至少 7 次合格的概率。这个要把 k7、8、9、10 四个概率加起来或者用betabinom.sf(6, 10, 16, 8)。算出来的量级大概在 0.35 左右。这类累积概率在制定验收标准的时候很有用比如我有七成把握说下一批至少 7 个合格这种表述背后就是这个计算。还有一道容易出错的变体如果问题是前 10 次里恰好 7 次合格且第 11 次也合格呢这时候要把两个事件分开算再相乘吗不行因为两者共享同一个 θ不独立。正确做法是把 11 次当成一个整体求 11 次里 8 次合格的概率或者用联合分布的形式推导。这道题我每次带练都会放几乎每次都有人掉进去掉一次之后就记住了同一个参数下的观测不独立这件事。5.3 决策题A/B 两组的比较最后走一遍两组比较的完整流程。A 组后验 Beta(11,23)B 组后验 Beta(7,27)。先看各自的摘要。A 组均值 11/34约 0.3235标准差约 0.0785B 组均值 7/34约 0.2059标准差约 0.0681。均值差了将近 12 个百分点但两组的标准差都在 7 到 8 个百分点所以这个差异虽然看起来不小但仍然有一定的不确定性。再看 P(θ_A θ_B)。用蒙特卡洛采样从两个后验各抽十万个样本数比例import numpy as np rng np.random.default_rng(42) a_samples rng.beta(11, 23, 100000) b_samples rng.beta(7, 27, 100000) print((a_samples b_samples).mean())我这边跑出来的结果稳定在 0.87 到 0.89 之间换个种子会有千分之一的波动十万个样本的蒙特卡洛误差大概在这个量级。想要更稳就把样本量加到一百万。这个数字怎么用如果决策规则是有 90% 以上把握才推广 A那现在还没到线需要继续收集数据。如果规则是有 85% 把握就小流量试运行那就可以动手了。注意这套逻辑里没有显著这个概念有的是一个连续的概率和一个明确的决策阈值这是贝叶斯决策和频率检验在实践上最大的差别。想要更完整的决策视角还可以算预期损失。假设选错的代价和选对的收益已知把后验分布和损失函数乘起来积分得到每个选项的期望损失选小的那个。这部分内容我在练习题里只做引子不展开但它展示了 Beta 后验能怎么接进更复杂的决策框架。6. 常见问题排查我见过的错误清单6.1 参数写反与口径不一致这是最高频的错误没有之一。表现是后验参数对不上、均值算出来偏离样本频率很远、区间位置明显不对劲。根源通常有两个。第一个是把成功和失败的定义搞反了比如把不合格记成了成功导致后验参数是 Beta(6,16) 而不是 Beta(16,8)。这种错误不会报错结果看起来也像一个合法分布只是整个结论反过来了。第二个是 α 和 β 的顺序在推导和代码里不一致手推的时候 α 对应成功写代码的时候beta.pdf(x, a, b)里 a 对应的是 x 的指数一不小心就串了。排查方法很简单算一个极端例子做校验。假设观测全是成功没有失败后验应该是 Beta(α₀s, β₀)。如果你算出来的是 Beta(α₀, β₀s)那就说明反了。这个断言检查我建议写进每个脚本里。还有一个不太明显的口径问题θ 到底代表什么。如果 θ 是合格率那 14 次合格就是 14 次成功但如果 θ 是不合格率同样的数据就要记成 6 次成功、14 次失败。题目里必须一开始就把 θ 的定义写死否则后面全是糊涂账。6.2 可信区间被解释成置信区间这个错误的杀伤力比第一个大因为它不影响计算只影响结论的表述而且很难被自己发现。95% 可信区间的正确读法是在看完数据之后θ 落在这个区间里的概率是 95%。这里的 θ 是随机变量区间是固定的由数据算出来的具体两个数。而频率学派的 95% 置信区间读法是如果重复抽样无数次有 95% 的区间会覆盖真实参数。这里的参数是固定的区间是随机的。这两句话听起来差不多含义完全不同。前者允许你说θ 大概率在这个范围里后者只能说这个构造方法的长期覆盖率是 95%不能说θ 有 95% 概率落在这一个具体区间里。练习题里我要求每个人用自己的话把两种解释各写一遍写不清楚就说明还没真正理解。还有一个相关的误区是把可信区间当成θ 的取值范围。区间外还有 5% 的概率而且这 5% 不是均匀分布的对于偏态后验左尾和右尾的概率分布完全不同。如果你要报告最可能的取值范围应该看 HPD 区间而不是等尾区间。6.3 边界参数下的公式失效α 或 β 小于等于 1 的时候好几个常用公式会失效或者给出荒谬结果这个坑我在 2.2 节提过这里展开说排查方法。众数公式 (α-1)/(αβ-2) 在 αβ1 时分母为 0在 αβ2 时分母为负在 α1 时分子为负。这三种情况算出来的数分别是 nan、负数、负数都不对。正确的处理是分情况讨论均匀分布没有唯一众数双峰分布有两个众数在边界单边发散时众数在对应的边界上。方差公式倒是一直有效但 α 或 β 极小时方差会接近 0.25这是 [0,1] 上可能的最大方差看起来像是完全不确定实际上分布是双峰的中间反而是低密度区。这种情况用方差描述不确定性会产生误导应该直接看密度图。分位数的计算在边界参数下也会变慢变糙。beta.ppf在 α0.5 的时候需要迭代求解精度会下降。稳妥的做法是对照解析解验证比如 αβ0.5 时的累积分布是 2/π 乘以 arcsin(√x)可以用它来检查数值结果。6.4 数值与采样问题数据量一大浮点问题就冒出来了。最常见的表现是beta.pdf返回 0、beta.mean返回 nan、beta.rvs报参数非法。返回 0 的原因是密度值太小超出了双精度浮点的表示范围。这时候要看的是对数密度beta.logpdf能正常返回一个很大的负数。如果必须比较两个极小的密度一定要在 log 空间比直接比原始值会得到两个都是 0的荒谬结论。返回 nan 的原因通常是参数非法比如 α 或 β 小于等于 0或者传了整数以外的奇怪类型。检查一下参数来源特别是从数据里算出来的参数有没有可能因为除零变成 inf。采样的问题主要出在随机种子上。做蒙特卡洛比较的时候如果不固定种子每次跑出来的概率会有千分级的波动容易让人误以为方法不稳定。固定种子之后结果可复现汇报的时候也更有说服力。另外样本量要够十万起步一百万更稳太少的话蒙特卡洛误差会盖过真实差异。6.5 速查表把上面这些问题压缩成一张表做题卡住的时候按行排查。现象最可能的原因排查动作后验均值离样本频率很远先验等效样本量太大检查 α₀β₀ 与观测数 n 的比值后验参数和手算对不上α、β 与成功失败对应反了用全成功的极端例子验证众数算出来是负数α 或 β 小于 1公式失效分情况讨论画密度图确认区间位置明显偏移分位数参数 q 传错了确认 q 是累积概率不是密度密度值全是 0