Beta分布 Python/NumPy 实战:3种参数组合可视化与期望/方差计算
Beta分布是概率论中一个非常有趣且实用的连续概率分布,它定义在区间(0,1)内,由两个形状参数α和β控制。这个分布在贝叶斯统计、机器学习以及许多实际应用中都有重要作用。本文将带你用Python和NumPy进行Beta分布的实战操作,通过可视化不同参数组合下的分布形态,并计算其期望和方差。
1. Beta分布基础概念
Beta分布的概率密度函数(PDF)定义为:
f(x; α, β) = x^(α-1) * (1-x)^(β-1) / B(α, β)其中B(α, β)是Beta函数,它与Gamma函数的关系为:
B(α, β) = Γ(α)Γ(β) / Γ(α+β)Beta分布有几个重要特性:
- 定义域:仅在0到1之间
- 形状多样性:通过调整α和β参数,可以得到多种不同形状的分布
- 统计量:
- 期望:E[X] = α / (α + β)
- 方差:Var(X) = αβ / [(α+β)²(α+β+1)]
在实际应用中,Beta分布常被用作伯努利试验和二项分布中成功概率p的先验分布,特别是在贝叶斯分析中。
2. 环境准备与依赖安装
在开始之前,我们需要确保安装了必要的Python库。以下是所需的依赖:
import numpy as np import matplotlib.pyplot as plt from scipy.stats import beta from scipy.special import beta as beta_func如果你还没有安装这些库,可以使用pip安装:
pip install numpy matplotlib scipy3. Beta分布可视化:3种参数组合
让我们选择三组不同的(α, β)参数组合,绘制它们的概率密度函数曲线:
- (2, 5):左偏分布
- (5, 5):对称分布
- (5, 2):右偏分布
以下是完整的可视化代码:
# 定义参数组合 params = [(2, 5), (5, 5), (5, 2)] colors = ['blue', 'green', 'red'] labels = ['α=2, β=5', 'α=5, β=5', 'α=5, β=2'] # 创建画布 plt.figure(figsize=(10, 6)) x = np.linspace(0, 1, 1000) # 绘制每条曲线 for (a, b), color, label in zip(params, colors, labels): y = beta.pdf(x, a, b) plt.plot(x, y, color=color, label=label, linewidth=2) # 添加图例和标签 plt.title('Beta Distribution with Different Parameters', fontsize=14) plt.xlabel('x', fontsize=12) plt.ylabel('Probability Density', fontsize=12) plt.legend(fontsize=12) plt.grid(True, alpha=0.3) plt.show()运行这段代码,你将看到三条不同颜色的曲线,分别对应三种参数组合。观察图形可以发现:
- 当α < β时,分布向左偏斜(峰值偏左)
- 当α = β时,分布对称
- 当α > β时,分布向右偏斜(峰值偏右)
4. 期望与方差计算
根据Beta分布的性质,我们可以直接计算每组参数的期望和方差。以下是计算代码:
# 计算期望和方差 results = [] for a, b in params: mean = a / (a + b) var = (a * b) / ((a + b)**2 * (a + b + 1)) results.append((mean, var)) # 以表格形式展示结果 print("| Parameters | Expectation | Variance |") print("|------------|-------------|----------|") for (a, b), (mean, var) in zip(params, results): print(f"| α={a}, β={b} | {mean:.4f} | {var:.6f} |")输出结果如下:
| Parameters | Expectation | Variance |
|---|---|---|
| α=2, β=5 | 0.2857 | 0.025510 |
| α=5, β=5 | 0.5000 | 0.022727 |
| α=5, β=2 | 0.7143 | 0.025510 |
从结果可以看出:
- 期望值确实反映了分布的"中心"位置
- 当α=β时,期望为0.5,这与对称分布一致
- 方差大小反映了分布的"集中"程度
5. 参数对分布形态的影响
为了更深入地理解参数如何影响Beta分布的形状,我们可以观察更多参数组合。以下代码展示了当固定一个参数,改变另一个参数时的分布变化:
# 固定β=2,改变α值 plt.figure(figsize=(10, 6)) alphas = [0.5, 1, 2, 5, 10] beta_val = 2 for a in alphas: y = beta.pdf(x, a, beta_val) plt.plot(x, y, label=f'α={a}, β={beta_val}') plt.title('Beta Distribution with Fixed β=2 and Varying α', fontsize=14) plt.legend() plt.grid(True, alpha=0.3) plt.show()这个可视化展示了当β固定时,增大α会使分布向右移动并改变其形状。类似地,我们也可以固定α而改变β:
# 固定α=2,改变β值 plt.figure(figsize=(10, 6)) alpha_val = 2 betas = [0.5, 1, 2, 5, 10] for b in betas: y = beta.pdf(x, alpha_val, b) plt.plot(x, y, label=f'α={alpha_val}, β={b}') plt.title('Beta Distribution with Fixed α=2 and Varying β', fontsize=14) plt.legend() plt.grid(True, alpha=0.3) plt.show()通过这些可视化,我们可以直观地理解Beta分布参数如何影响其形状和位置。
6. 实际应用示例:点击率估计
Beta分布在现实世界中有许多应用,其中一个典型例子是估计广告点击率(CTR)。假设我们有一个广告,观察到了10次点击和90次未点击。我们可以使用Beta分布来建模点击率的不确定性。
# 广告点击率示例 clicks = 10 non_clicks = 90 # 使用Beta分布建模 a = clicks + 1 # 伪计数+1 b = non_clicks + 1 # 绘制分布 plt.figure(figsize=(10, 6)) y = beta.pdf(x, a, b) plt.plot(x, y, label=f'α={a}, β={b}') plt.axvline(x=a/(a+b), color='red', linestyle='--', label='Mean') plt.title('CTR Estimation with Beta Distribution', fontsize=14) plt.xlabel('Click Through Rate', fontsize=12) plt.ylabel('Probability Density', fontsize=12) plt.legend() plt.grid(True, alpha=0.3) plt.show() # 计算95%置信区间 lower = beta.ppf(0.025, a, b) upper = beta.ppf(0.975, a, b) print(f"95%置信区间: [{lower:.4f}, {upper:.4f}]")这个例子展示了如何使用Beta分布来估计点击率及其不确定性。随着收集到更多数据,我们可以更新分布参数,得到更精确的估计。
7. Beta分布与其他分布的关系
Beta分布与几种常见分布有密切关系:
- 均匀分布:当α=1且β=1时,Beta分布退化为均匀分布
- 二项分布:Beta分布是二项分布的共轭先验
- Gamma分布:如果X~Gamma(α,θ)和Y~Gamma(β,θ)独立,则X/(X+Y)~Beta(α,β)
以下代码展示了Beta分布与均匀分布的关系:
# Beta分布与均匀分布 plt.figure(figsize=(10, 6)) y_uniform = np.ones_like(x) # 均匀分布PDF plt.plot(x, y_uniform, label='Uniform(0,1)', linestyle='--') y_beta = beta.pdf(x, 1, 1) # Beta(1,1) plt.plot(x, y_beta, label='Beta(1,1)') plt.title('Beta(1,1) is Equivalent to Uniform(0,1)', fontsize=14) plt.legend() plt.grid(True, alpha=0.3) plt.show()8. 从Beta分布中抽样
我们可以使用NumPy从Beta分布中生成随机样本,并验证其统计性质:
# 从Beta(2,5)中抽样 a, b = 2, 5 samples = np.random.beta(a, b, size=10000) # 绘制直方图 plt.figure(figsize=(10, 6)) plt.hist(samples, bins=50, density=True, alpha=0.6, color='blue') # 绘制理论PDF x = np.linspace(0, 1, 100) y = beta.pdf(x, a, b) plt.plot(x, y, 'r-', lw=2, label='Theoretical PDF') # 计算样本均值和方差 sample_mean = np.mean(samples) sample_var = np.var(samples) theoretical_mean = a / (a + b) theoretical_var = (a * b) / ((a + b)**2 * (a + b + 1)) plt.title('Sampling from Beta(2,5)', fontsize=14) plt.xlabel('x', fontsize=12) plt.ylabel('Density', fontsize=12) plt.legend() plt.grid(True, alpha=0.3) plt.show() print(f"样本均值: {sample_mean:.4f} (理论值: {theoretical_mean:.4f})") print(f"样本方差: {sample_var:.6f} (理论值: {theoretical_var:.6f})")运行结果会显示样本统计量与理论值非常接近,验证了我们从Beta分布中正确生成了随机数。