> 文档中心 > 利用python实现泊松分布

利用python实现泊松分布

前面我们学习了伯努利分布、二项分布和几何分布,传送门:
利用python实现伯努利分布和二项分布
利用python实现几何分布
今天我们来学习离散概率分布之泊松分布。

1、基本理论知识

  • 泊松分布适合描述在单位时间内随机事件发生的次数或概率。比如:某网站或app在单位时间内访问的人数,满足分布律:P ( X = k ) = λ kk ! 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 npimport matplotlib.pyplot as pltfrom scipy import statsplt.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次电话的概率是最大的。