快捷搜索: 王者荣耀 脱发

python-介绍泊松分布(poisson分布)

一、泊松分布问题:

假设我每天接到骚扰电话的次数服从泊松分布,并且经统计平均每天我会接到20个骚扰电话。 请问: 1、我明天接到15个骚扰电话的概率? 2、我明天接到24个骚扰电话以下的概率(包含24)?

二、泊松分布公式:

首先要清楚,泊松分布是离散的,也就是说我接到骚扰电话次数必须是整数,要么就是15次,要么就是16次...,而不会是15.5次。

泊松分布的概率函数为:

累积概率分布函数为:

其实就是概率函数的累加。

均值方差:泊松分布的均值和方差都是。

针对上面的问1这里就是20,k就是15。

三、解决问题

方法一:根据公式编写代码

import math

def p_possion(k, m):
    kjie = 1  #k!
    for i in range(1, k+1):
        kjie*=i
    pk = math.pow(m, k)/kjie*math.e**(-m)
    return pk

p = p_possion(15, 20)
print("接到15个骚扰电话的概率:",p)

p=0
for i in range(0,25):
    p+=p_possion(i, 20)
print("接到24个骚扰电话以下的概率:",p)

结果:

接到15个骚扰电话的概率: 0.0516488535317584 接到24个骚扰电话以下的概率: 0.8432273781737633

方法二:用scipy包中的scipy.stats.poisson

from scipy import stats

p = stats.poisson.pmf(15, 20)
print("接到15个骚扰电话的概率:",p)

p = stats.poisson.cdf(24, 20)
print("接到24个骚扰电话以下的概率:",p)

四、泊松概率及累积概率分布

仍以骚扰电话为例,计算接到电话0~50次的概率:

from scipy import stats
import matplotlib.pyplot as plt
plt.rcParams[font.sans-serif]=[SimHei]#用来正常显示中文标签
plt.rcParams[axes.unicode_minus]=False#用来正常显示负号

X=range(0,51)
Y=[]
for k in X:
    p = stats.poisson.pmf(k, 20)
    Y.append(p)

plt.bar(X, Y, color="red")
plt.xlabel("次数")
plt.ylabel("概率")
plt.title("接到骚扰电话次数及概率")
plt.show()

结果:

首先可以看出,在均值20附近,概率最大,均值两边概率呈递减状态。再者可以看到这结果很像二项分布,也像正态分布,关于两者三个分布的相似,这里不做讨论。

五、查表

查表前面代码中有涉及,其实就是查累积概率。查询=100,发生次数小于等于120的概率:

from scipy import stats

p = stats.poisson.cdf(120, 100)
print(p)

结果:0.9773306709216473

六、随机数生成

生成服从=50的泊松分布随机数100个:

from scipy import stats
# 设置random_state时,每次生成的随机数一样。不设置或为None时,多次生成的随机数不一样
sample = stats.poisson.rvs(mu=50, size=100, random_state=3)
print(sample)

结果:

[51 45 60 40 34 53 54 45 45 49 51 46 48 61 47 53 47 48 45 49 52 45 43 50 50 54 54 47 47 46 36 72 54 55 52 37 42 41 54 54 55 58 53 53 51 43 58 38 63 50 44 53 48 43 53 45 67 37 51 42 54 47 59 55 54 55 55 46 60 43 54 45 59 44 58 45 51 58 56 47 54 33 55 50 58 49 60 37 51 43 50 52 52 45 42 44 49 54 52 48]

author:蓝何忠

email:lanhezhong@163.com

经验分享 程序员 微信小程序 职场和发展