Beta 分布:如何用“成功”和“失败”来预测下次尝试

0 阅读7分钟

想象一下这个场景:明天你要去一家新开的网红餐厅。你翻开点评软件,看到过去 10 个人里,有 7 个人给了好评。

那么,你明天去吃到美食的概率到底是多少?
是 70% 吗?不一定。

如果你只看这 10 条评论,你的信心其实很脆弱——万一这 10 个人都是老板请来的托呢?但如果这家店有 1000 条评论,其中 700 条好评,你心里就会踏实很多。

这个“心里踏实”的微妙感觉,其实就是Beta 分布在帮你做潜意识里的计算。

今天,我们就用最贴近生活的方式,来拆解这个神奇的分布,并看看怎么用 Python 来应用它。

扔掉公式,用“伪计数”来理解 Beta 分布

统计学上的 Beta 分布由两个参数决定:α (alpha)β (beta)

为了不让你被复杂的数学公式吓跑,我们把它翻译成大白话:

  • α(阿尔法):可以看作是你经历过的 “成功次数 + 1”
  • β(贝塔):可以看作是你经历过的 “失败次数 + 1”

核心直觉:Beta 分布就是用来描述 “一个概率值本身” 的概率分布。

它告诉你的不是“这件事成功率是 80%”,而是 “这件事成功率大概在 80% 左右,我有多大的把握”

当 α 和 β 变化时,它的形状就像情绪一样多变:

  • α=1, β=1:完全平坦。代表“我啥都不知道,成功率从 0% 到 100% 都一样可能”(无知状态)。
  • α=2, β=2:中间高两边低。代表“我有一点经验,觉得成功率大概在 50% 附近晃悠”。
  • α=5, β=2:明显偏右。代表“我看到的成功比失败多,我觉得这事大概率能成”。
  • α=0.5, β=0.5:两边高中间低。代表极端思维——“我觉得这事要么极好,要么极差,不太可能中庸”。

用 Python 画出你内心的“把握程度”

我们先用代码把上面这几种“心态”画出来,让你直观感受一下。

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import beta

# 定义几种不同的心态(α, β)
# (1,1) 代表一无所知;(5,2) 代表乐观;(2,5) 代表悲观;(5,5) 代表很有把握地觉得在 50% 左右
minds = [(1, 1), (5, 2), (2, 5), (5, 5)]
x = np.linspace(0, 1, 200)

plt.figure(figsize=(10, 6))
for a, b in minds:
    y = beta.pdf(x, a, b)
    label = f'α={a}, β={b} (心态:{"纯小白" if (a,b)==(1,1) else "乐观" if a>b else "悲观" if a<b else "稳重型"})'
    plt.plot(x, y, label=label)

plt.title('Beta 分布:你不同心态下的“概率预测曲线”')
plt.xlabel('事情成功的概率(0到1)')
plt.ylabel('你对该概率的相信程度(密度)')
plt.legend()
plt.show()

运行这段代码,你会发现:当 α 和 β 都很大且相等时(比如 5,5),曲线变得又高又窄——这意味着你的把握度很高,坚信成功率就在 50% 附近,不认为它会有极端偏离。

实战应用——用“外卖送达时间”练手

假设你刚搬到一个新小区,点了 10 次外卖。

其中有 7 次外卖员在预计时间前到达(我们称为“提前到达”),3 次迟到。

如果你只凭直觉,你会说“下次提前到的概率是 70%”,但 Beta 分布能告诉你这个 70% 有多“虚”。

我们利用 贝叶斯更新 的神奇之处:先验(你之前的经验)+ 新的数据 = 后验(你修正后的看法)

假如你是个“悲观主义者”,在没有点外卖前,你觉得外卖大概率会迟到,所以你给自己设了一个悲观的先验:α=2, β=5

现在你获得了新数据:7 次成功(提前),3 次失败(迟到)。
那么更新后的后验参数就是:

  • 新 α = 先验 α + 成功数 = 2 + 7 = 9
  • 新 β = 先验 β + 失败数 = 5 + 3 = 8

看看你的观念是如何被现实数据“掰正”的:

from scipy.stats import beta
import matplotlib.pyplot as plt
import numpy as np

# 1. 设定先验(悲观派:觉得外卖大概率迟到)
prior_a, prior_b = 2, 5

# 2. 收集新数据(10次里,7次提前,3次迟到)
successes = 7
failures = 3

# 3. 更新后验
posterior_a = prior_a + successes
posterior_b = prior_b + failures

x = np.linspace(0, 1, 100)

plt.figure(figsize=(10, 6))
# 画出先验(没数据前的瞎猜)
plt.plot(x, beta.pdf(x, prior_a, prior_b), label=f'先验(悲观猜测)α={prior_a}, β={prior_b}', linestyle='--')
# 画出后验(看到数据后的修正)
plt.plot(x, beta.pdf(x, posterior_a, posterior_b), label=f'后验(修正后)α={posterior_a}, β={posterior_b}', linewidth=3, color='red')

plt.title('悲观主义者看到“7次提前到达”后,信念如何被颠覆?')
plt.xlabel('外卖提前到达的概率')
plt.ylabel('相信程度')
plt.axvline(x=(posterior_a/(posterior_a+posterior_b)), color='green', linestyle=':', label=f'修正后均值: {posterior_a/(posterior_a+posterior_b):.2f}')
plt.legend()
plt.show()

有趣的地方来了:虽然你一开始很悲观(曲线偏左),但 7 次提前的强有力证据,硬生生把后验曲线拉到了右侧。

并且,通过 Beta 分布,你现在不仅能给出“下次提前概率约 53%”(均值),还能看到这条曲线有多宽——曲线越宽,代表你越不确定;数据越多,曲线越窄,你越自信。

更进一步,如果你点了 100 次外卖,有 70 次提前,30 次延迟,那么:

# 2. 收集新数据(10次里,7次提前,3次迟到)
successes = 70
failures = 30

曲线变窄了,经过那么多次点外卖的经验,你的预测会越来越准。早期悲观的先验影响越来越小。

Beta 分布在你生活里的“隐藏菜单”

学完上面的代码,你会发现 Beta 分布无处不在,只是你没意识到:

  1. 产品经理的 A/B 测试:网页改了按钮颜色,点击率变了。PM 不会只看“高了 5%”,而是用 Beta 分布算一下--这个提升到底是因为运气,还是真的有效?(数据多了,曲线变尖,信心才足)。
  2. 游戏玩家的“玄学”抽卡:官方说掉率是 1%。你抽了 200 次没出,此时你心中的“真实掉率”曲线(Beta 分布)会急剧向左偏移,让你觉得官方在骗人。
  3. 运动训练中的手感:篮球运动员投了 3 个球进了 2 个,他不会觉得命中率是 66%,他会想“今天手感还行”。但如果他投了 30 个进了 20 个,那个 Beta 分布的曲线会变得非常尖锐,他才会真正相信自己今天有 66% 的命中率。

快速上手代码模板(可直接复制用)

如果你想在你的工作或小项目里套用 Beta 分布,记住这个万能模板就行了:

from scipy.stats import beta

# 你的历史经验(先验):比如之前见过 10 次,成功 4 次,失败 6 次
prior_a, prior_b = 4, 6  

# 你新观察到的数据:比如今天又做了 20 次,成功 15 次,失败 5 次
new_success = 15
new_failure = 5

# 计算更新后的后验参数(这就是贝叶斯更新的精髓)
updated_a = prior_a + new_success
updated_b = prior_b + new_failure

# 计算你最新的“成功概率”的最佳估计(均值)
mean_prob = updated_a / (updated_a + updated_b)
print(f"基于所有数据,你估计的成功概率为: {mean_prob:.2%}")

# 如果你想看 95% 的置信区间(即你有多大把握范围),可以这样算:
lower, upper = beta.ppf(0.025, updated_a, updated_b), beta.ppf(0.975, updated_a, updated_b)
print(f"你 95% 确信真正的成功率在: {lower:.2%}{upper:.2%} 之间")

总结

Beta 分布本质上就是人类大脑理性思考不确定性的数学映射

它告诉我们:一个孤立的概率数字(比如 70%)是没有灵魂的,必须搭配上“你见过多少次世面”(即 α 和 β 的大小),这个数字才有意义。

下次当你再看到某个商品的“五星好评率 90%”时,别忘了看一眼评论总数。

如果只有 10 条,它的 Beta 分布还宽得很(不可信);

如果有 10000 条,它的 Beta 分布就是一座尖峰(可信赖)。

这就是 Beta 分布教给我们的数据智慧。