Python SciPy 1.13 实战:12种概率分布模拟与关键参数可视化对比
·
Python SciPy 1.13 实战:12种概率分布模拟与关键参数可视化对比
在数据分析与机器学习领域,概率分布是描述随机变量行为的数学工具。掌握不同分布的特性和应用场景,能帮助我们更准确地建模现实问题。本文将使用SciPy 1.13库,通过Python代码实现12种常见概率分布的模拟与可视化,并重点分析关键参数对分布形态的影响。
1. 环境准备与数据生成
首先确保已安装最新版SciPy和Matplotlib库。我们创建一个包含所有必要导入语句和辅助函数的初始化模块:
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
import seaborn as sns
def plot_distribution(ax, dist, params, x_range, label):
"""通用分布绘图函数"""
x = np.linspace(*x_range, 1000)
if hasattr(dist, 'pdf'):
y = dist.pdf(x, *params)
ax.plot(x, y, label=label)
else: # 离散分布
x = np.arange(*x_range)
y = dist.pmf(x, *params)
ax.vlines(x, 0, y, colors='b', lw=5, alpha=0.5, label=label)
ax.set_xlim(x_range)
ax.legend()
2. 离散型分布对比分析
2.1 伯努利与二项分布
伯努利分布是单次试验的二元结果模型,而二项分布是其n次独立重复的扩展:
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4))
# 伯努利分布
p = 0.7
bernoulli = stats.bernoulli(p)
plot_distribution(ax1, bernoulli, (p,), (0, 1), f'Bernoulli(p={p})')
# 二项分布
n, p = 20, 0.4
binomial = stats.binom(n, p)
plot_distribution(ax2, binomial, (n, p), (0, 20), f'Binomial(n={n}, p={p})')
plt.tight_layout()
关键参数对比表 :
| 分布类型 | 参数 | 期望 | 方差 | 适用场景 |
|---|---|---|---|---|
| 伯努利 | p | p | p(1-p) | 单次二元试验 |
| 二项 | n,p | np | np(1-p) | n次独立伯努利试验 |
2.2 泊松与几何分布
泊松分布描述单位时间内事件发生次数,几何分布描述首次成功所需的试验次数:
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4))
# 泊松分布
mu = 3
poisson = stats.poisson(mu)
plot_distribution(ax1, poisson, (mu,), (0, 10), f'Poisson(μ={mu})')
# 几何分布
p = 0.2
geom = stats.geom(p)
plot_distribution(ax2, geom, (p,), (1, 20), f'Geometric(p={p})')
plt.tight_layout()
注意:泊松分布的μ参数既是期望又是方差,这种等离散性(equidispersion)特性使其在计数数据建模中非常有用。
3. 连续型分布深度解析
3.1 正态分布及其变体
正态分布是统计学中最重要的连续分布,其参数敏感性分析如下:
fig, ax = plt.subplots(figsize=(10, 6))
# 不同参数组合
params = [(0, 1), (0, 2), (1, 1), (2, 0.5)]
for μ, σ in params:
x = np.linspace(μ-4*σ, μ+4*σ, 1000)
y = stats.norm.pdf(x, μ, σ)
ax.plot(x, y, label=f'N(μ={μ}, σ={σ})')
ax.set_title('正态分布参数影响')
ax.legend()
plt.show()
正态分布特性总结 :
- 对称性:关于均值μ对称
- 拐点:μ±σ处为概率密度函数拐点
- 3σ法则:约99.7%数据落在μ±3σ内
3.2 指数与伽马分布
指数分布是伽马分布的特例(α=1),描述事件间隔时间:
fig, ax = plt.subplots(figsize=(10, 6))
# 指数分布
lambda_exp = 0.5
x = np.linspace(0, 10, 1000)
y_exp = stats.expon.pdf(x, scale=1/lambda_exp)
ax.plot(x, y_exp, label=f'Exponential(λ={lambda_exp})')
# 伽马分布
alpha, beta = 3, 0.5
y_gamma = stats.gamma.pdf(x, a=alpha, scale=1/beta)
ax.plot(x, y_gamma, label=f'Gamma(α={alpha}, β={beta})')
ax.legend()
plt.show()
记忆无性质验证 :
# 指数分布无记忆性验证
t, s = 2, 3
prob = stats.expon.sf(t + s) / stats.expon.sf(t)
print(f"P(T > {t+s} | T > {t}) = {prob:.4f}")
print(f"P(T > {s}) = {stats.expon.sf(s):.4f}")
4. 高级可视化与参数对比
4.1 分布族参数曲面
通过三维可视化展示参数如何影响分布形态:
from mpl_toolkits.mplot3d import Axes3D
# 创建参数网格
alpha_vals = np.linspace(1, 10, 50)
beta_vals = np.linspace(0.1, 2, 50)
Alpha, Beta = np.meshgrid(alpha_vals, beta_vals)
# 计算伽马分布峰值
Peak = (Alpha - 1) / Beta
# 绘制3D曲面
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')
surf = ax.plot_surface(Alpha, Beta, Peak, cmap='viridis')
ax.set_xlabel('α')
ax.set_ylabel('β')
ax.set_zlabel('分布峰值')
plt.colorbar(surf)
plt.show()
4.2 统计量对比矩阵
构建所有分布的期望和方差对比表格:
import pandas as pd
distributions = {
'Bernoulli': {'params': (0.7,), 'expect': lambda p: p, 'variance': lambda p: p*(1-p)},
'Binomial': {'params': (20, 0.4), 'expect': lambda n,p: n*p, 'variance': lambda n,p: n*p*(1-p)},
'Poisson': {'params': (3,), 'expect': lambda μ: μ, 'variance': lambda μ: μ},
'Normal': {'params': (0, 1), 'expect': lambda μ,σ: μ, 'variance': lambda μ,σ: σ**2},
'Exponential': {'params': (0.5,), 'expect': lambda λ: 1/λ, 'variance': lambda λ: 1/λ**2}
}
results = []
for name, config in distributions.items():
row = {
'Distribution': name,
'Parameters': config['params'],
'Theoretical Expectation': config['expect'](*config['params']),
'Theoretical Variance': config['variance'](*config['params'])
}
results.append(row)
df = pd.DataFrame(results)
print(df.to_markdown(index=False))
5. 实际应用案例
5.1 正态分布在质量控制中的应用
假设某零件尺寸服从N(10, 0.04),计算合格率并可视化:
mu, sigma = 10, 0.2
lower, upper = 9.5, 10.5
# 计算合格概率
prob = stats.norm.cdf(upper, mu, sigma) - stats.norm.cdf(lower, mu, sigma)
print(f"合格概率: {prob*100:.2f}%")
# 可视化
x = np.linspace(mu-4*sigma, mu+4*sigma, 1000)
y = stats.norm.pdf(x, mu, sigma)
plt.plot(x, y)
plt.fill_between(x, y, where=((x >= lower) & (x <= upper)), color='lightblue')
plt.title('零件尺寸合格范围')
plt.show()
5.2 泊松分布在流量预测中的应用
模拟网站每小时访问量并预测服务器负载:
np.random.seed(42)
hourly_traffic = stats.poisson.rvs(mu=50, size=24)
plt.figure(figsize=(12, 4))
plt.bar(range(24), hourly_traffic)
plt.axhline(y=70, color='r', linestyle='--', label='服务器上限')
plt.title('网站每小时访问量模拟')
plt.xlabel('小时')
plt.ylabel('访问量')
plt.legend()
plt.show()
# 计算超载概率
overload_prob = 1 - stats.poisson.cdf(70, mu=50)
print(f"服务器超载概率: {overload_prob*100:.2f}%")
6. 完整Jupyter Notebook实现
将所有代码整合到一个可执行的Jupyter Notebook中,包含以下部分:
- 交互式参数调节控件
- 动态更新图表功能
- 导出为HTML或PDF的配置
- 所有分布的完整代码实现
# 在Jupyter中创建交互控件
from ipywidgets import interact
@interact(p=(0.1, 0.9, 0.1), n=(5, 50, 5))
def plot_interactive_binomial(p=0.5, n=20):
x = np.arange(0, n+1)
y = stats.binom.pmf(x, n, p)
plt.bar(x, y)
plt.title(f'Binomial(n={n}, p={p})')
plt.show()
通过本文的实践演示,我们不仅掌握了各种概率分布的数学特性,更学会了如何用Python进行高效的可视化分析。这种技能在数据科学项目的探索性分析阶段尤为重要,能帮助我们快速理解数据背后的概率机制。
更多推荐
所有评论(0)