终于把统计学中的 beta 分布搞懂了!!
终于把统计学中的 beta 分布搞懂了!!
Beta分布是统计学中一个非常重要的概率分布,广泛应用于贝叶斯统计、A/B测试、机器学习等领域。本文将从Beta分布的定义、性质到实际应用,为您全面解析这一重要概念。
Beta分布是一种定义在区间上的连续概率分布,广泛用于建模概率或比例等随机变量。它由两个正实数参数和控制分布的形状。
Beta分布特别适合用来描述一个事件发生的概率,例如一次实验成功的比例。它也是二项分布的共轭先验分布,这使得它在贝叶斯统计中应用广泛。
概率密度函数 (PDF)
Beta分布的概率密度函数定义为:
其中:
- 是 Beta 函数,用于归一化概率密度,使总概率为 1。
- 和是形状参数,控制分布的偏态。
- 当时,Beta 分布是均匀分布。
- 当时,分布偏向 1,表示成功的可能性更大。
- 当时,分布偏向 0,表示失败的可能性更大。
- 当 时,分布在 0.5 对称,且随着增大,分布越集中。
均值和方差
均值
由此可知,越大,分布的中心越靠近 1,而越大,分布的中心越靠近 0。
方差
随着和的增大,方差减小,分布更加集中。
Beta 分布的直观解释
Beta 分布可以视为对一个成功率的建模。
例如,假设我们希望估计一个硬币正面朝上的概率:
- 如果我们没有任何信息,初始假设是均匀分布,即 Beta(1, 1)。
- 如果我们观察到 3 次正面和 2 次反面,新的分布是 Beta(4, 3)(将正面次数加到,反面次数加到)。
Beta 分布的应用
贝叶斯统计
Beta 分布作为二项分布或伯努利分布的共轭先验分布,是贝叶斯推断的重要工具。
例如,用 Beta 分布建模事件的成功率(概率),在观察到数据后更新分布。A/B 测试
Beta 分布常用于评估两个组的成功率,例如广告点击率或转化率。
配合汤普森抽样,可以动态调整实验分组,最大化实验收益。机器学习中的多臂老虎机问题
在探索与利用问题中,用 Beta 分布建模动作的成功概率(例如,点击率)。概率建模
用于描述概率值的不确定性。
例如,预测新产品的市场成功率。生物统计
描述某一实验或过程的成功率分布,比如基因组学中的分布建模。
案例分享
假设你在做一个在线广告的 A/B 测试,有两个版本的广告(A 和 B)。
你希望判断哪一个广告更有可能获得较高的点击率(CTR)。
在不知道广告点击率真实情况的前提下,你可以通过 Beta 分布对广告点击率的未知概率建模。
初始设定
对广告 A 和 B 的点击率有先验分布,即均匀分布,
这表示在实验开始前对广告点击率没有任何偏好或先验知识。数据收集
在实验中,你会记录广告 A 和 B 的点击(成功)与未点击(失败)次数。
每当有新数据进来,你就根据 Beta 分布的更新规则来更新参数。
- 成功(点击):
- 失败(未点击):
后验分布
随着数据积累,A 和 B 各自的 Beta 分布会逐渐收敛到其真实点击率的附近。
例如,如果广告 A 的点击次数为 30 次,未点击 70 次,那么 A 的后验分布将为。
这意味着我们对 A 的点击率更有信息,它更有可能在约 30% 左右()。
决策过程
可以使用汤普森抽样进行决策,从每个广告的 Beta 分布中随机抽样一个概率值,然后选择抽样值较高的广告进行下一次展示。如此反复,会逐渐将流量更多地分配给点击率更高的广告。
下面的代码演示了一个简单的过程:
- 我们模拟广告 A 的真实点击率为 0.3,广告 B 的真实点击率为 0.4。
- 我们通过不断观察点击数据并更新 Beta 分布参数,最终验证后验均值渐渐接近真实点击率。
import numpy as np
from scipy.stats import beta
# 假设广告 A 和 B 的真实点击率(未知的真值)
true_ctr_A = 0.3
true_ctr_B = 0.4
# 初始先验参数:Beta(1, 1) 对应均匀分布
alpha_A, beta_A = 1, 1
alpha_B, beta_B = 1, 1
# 模拟实验轮数
num_trials = 10000
# 用于记录每次实验的后验均值
posterior_means_A = []
posterior_means_B = []
# 模拟试验过程
for i in range(num_trials):
# 汤普森抽样:从后验分布中抽样
sample_A = np.random.beta(alpha_A, beta_A)
sample_B = np.random.beta(alpha_B, beta_B)
# 根据抽样值决定这次展示哪个广告
if sample_A > sample_B:
# 选择广告 A
chosen_ad = 'A'
# 模拟真实点击结果
click = np.random.rand() < true_ctr_A
# 根据是否点击更新 A 的Beta分布参数
if click:
alpha_A += 1
else:
beta_A += 1
else:
# 选择广告 B
chosen_ad = 'B'
# 模拟真实点击结果
click = np.random.rand() < true_ctr_B
# 更新 B 的 Beta 分布参数
if click:
alpha_B += 1
else:
beta_B += 1
# 记录此时两组广告后验分布的均值
posterior_means_A.append(alpha_A / (alpha_A + beta_A))
posterior_means_B.append(alpha_B / (alpha_B + beta_B))
# 输出最终估计的点击率
print(f'Final estimated CTR for A: {alpha_A / (alpha_A + beta_A):.3f} (True: {true_ctr_A})')
print(f'Final estimated CTR for B: {alpha_B / (alpha_B + beta_B):.3f} (True: {true_ctr_B})')
# 可选:绘制后验分布对比
import matplotlib.pyplot as plt
x = np.linspace(0, 1, 200)
pdf_A = beta(alpha_A, beta_A).pdf(x)
pdf_B = beta(alpha_B, beta_B).pdf(x)
plt.figure(figsize=(10,6))
plt.plot(x, pdf_A, label=f'Ad A Posterior: Beta({alpha_A},{beta_A})')
plt.plot(x, pdf_B, label=f'Ad B Posterior: Beta({alpha_B},{beta_B})')
plt.axvline(true_ctr_A, color='blue', linestyle='--', label='True CTR A')
plt.axvline(true_ctr_B, color='orange', linestyle='--', label='True CTR B')
plt.title('Posterior Distributions after Simulation')
plt.xlabel('CTR')
plt.ylabel('Density')
plt.legend()
plt.show()