前面我们学习了伯努利分布、二项分布和几何分布,传送门:
利用python实现伯努利分布和二项分布
利用python实现几何分布
今天我们来学习离散概率分布之泊松分布。
1、基本理论知识
- 泊松分布适合描述在单位时间内随机事件发生的次数或概率。比如:某网站或app在单位时间内访问的人数,满足分布律: P ( X = k ) = λ k k ! e − λ P(X=k)=\frac{\lambda^k}{k!}e^{-\lambda} P(X=k)=k!λke−λ,其中 λ \lambda λ表示单位时间内随机事件平均发生的次数,P就代表单位时间内随机事件发生k次的概率。
- 特点:
- 事件独立;
- 在任意相同的时间范围内,事件的发生概率相同;
- 解决的问题是:在某段时间内,某件事情发生的概率。
2、python实现
numpy实现:np.random.poisson(lam, size) 参数(单位时间内事件平均发生次数,样本数即进行多少次实验)。
得到的是size次实验中,每次实验中事件发生的次数,并非概率
stats实现:stats.poisson.pmf(k,lam)参数(需求的单位时间内事件的发生次数,单位时间内事件平均发生次数)。
得到的是单位时间内事件发生的概率
stats运行结果始终是定值,而numpy运行结果每次都不一样,但误差较小。
我觉得numpy还是比较好的,因为可以改变试验次数,进行多次实验后进行平均值处理,可以得到更高的准确性吧。个人想法,如果不对,请指正。
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
plt.rcParams['font.sans-serif'] = 'SimHei' # 解决画图不显示文字的问题
plt.rcParams['axes.unicode_minus'] = False # 解决画图不显示负数的问题
"""
假定某航空公司预定票处平均每小时接到42次订票电话,那么10分钟内恰好接到6次电话的概率是多少
"""
lam = 42 / 6 # 一小时42次,那么每10分钟接到42/6次电话 单位时间内平均次数
size = 50000 # 进行50000次实验
print(np.random.poisson(lam,1)) # [10] # 进行一次实验,结果是10分钟内接到了10次电话
x = np.random.poisson(lam, size) # 进行50000次实验
print(x) # [11 7 7... 6 2 13] # 结果是随机的,每次实验的结果都不一定一样,
print(np.sum(x == 6) / size) # 0.1467 # 50000次实验中,10分钟内接到6次电话的结果次数 / 总实验数
plt.hist(x)
plt.xlabel('随机变量:每十分钟接到订票电话的次数')
plt.ylabel('50000个样本中出现的次数')
plt.xticks([index + 0.6 for index in range(0,20)], range(0,20)) #设置x轴格式,使图形在刻度线正中间
plt.show()
x = stats.poisson.pmf(6, lam) # 直接求概率
print(x) # 0.1490
print(x*50000) #这样也可以得到50000次实验中,出现接到6次电话的次数
# 可以看出两种方法的结果是差不多的。
- 从图中我们可以看出,50000次实验中,10分钟接到5—9次电话的概率是最大的。