龙空技术网

Python数据分析|泊松分布应用实战「附代码」

老Q爱折腾 283

前言:

当前同学们对“泊松分布相应的程序算法”大体比较关心,我们都想要剖析一些“泊松分布相应的程序算法”的相关资讯。那么小编也在网上汇集了一些有关“泊松分布相应的程序算法””的相关资讯,希望看官们能喜欢,小伙伴们一起来了解一下吧!

主要内容:

一、什么是泊松分布

二、用Python解决实际问题

三、泊松分布的形态变化

泊松分布以法国数学家泊松命名,他在1837年出版了一篇关于泊松分布的论文。

一、什么是泊松分布

泊松分布通常是与固定时间或空间间隔内的计数相关的离散分布。比如:

我平均每周写三篇文章,那我下周会写几篇文章?小明平均一个月健身7次,那下个月他会健身几次?马路边上平均每1000米停有20辆车,那下一个一千米停了多少辆车?老板平均一天找我两回,假如我明天翘班,他有多大概率不会发现?

在这两个例子中,每周、每月、每1000米对应着固定的时间或空间,而三篇文章、健身七次、20辆车则对应着在固定时间或空间中的计数。泊松分布描述了在类似情境下不同计数的发生概率。

泊松分布对应的概率密度函数为:

在这里,λ就是我们前边提到的固定时间或空间内的计数的均值,或者叫期望,同时,它还是泊松分布的方差。有了概率密度函数之后,剩下的就是计算了,而计算工作交给计算机来完成再好不过。

在实际生活中,泊松分布的应用面非常广,比如在交通规划中,我们需要判断一个小时内经过某路口的车辆有多少;在地铁站中,我们想知道一个小时内的客流量有多大可能会超出承载能力;在网站运维中,我们要弄清楚流量的峰值可能会是多少,有多大概率会发生这种情况等等。

那么接下来,我们就来看一下它是如何解决实际问题的。

二、用Python解决实际问题

我们先写一个poison_pdf(lamb, k)函数,计算期望为lamb的泊松分布中,刚好计数为k的概率是多少;然后写一个poison_pdf(lamb, k)函数,计算期望为lamb的泊松分布中,计数≤k的概率是多少。

from math import exp, factorial# 概率密度函数def poison_pdf(lamb, k): return lamb ** k * exp(-lamb) / factorial(k) # 累计分布函数def poison_cdf(lamb, k): return sum([poison_pdf(lamb, i) for i in range(k+1)])

好,接下来我们来回答刚才的第一个问题:我平均每周写三篇文章,下周我会写几篇?

s = ('一周刚好写{0}篇文章的概率为{1:.2f}%,' '写不超过{2}篇文章的概率为{3:.2f}%')for i in range(11): print(s.format(i, poison_pdf(3, i) * 100, i, poison_cdf(3, i) * 100))

可以看到,我下周有90%+的概率会写不超过5篇文章。但是这样看起来不够直观,我们把它画出来看一下:

import seaborn as snsimport matplotlib.pyplot as pltimport matplotlib as mplfrom matplotlib.ticker import FuncFormattersns.set(style='white')mpl.rcParams['font.family'] = 'sans-serif'mpl.rcParams['font.sans-serif'] = 'WenQuanYi Micro Hei'# 用来将坐标轴数字转换成百分比def to_percent(tmp, position): return '{0:.1f}%'.format(tmp * 100)# 计算概率密度和累积概率密度k = list(range(11))pdf = [poison_pdf(3, i) for i in range(11)]cdf = [poison_cdf(3, i) for i in range(11)]# 绘制概率密度条形图fig, ax1 = plt.subplots(figsize=(10, 6))ax1.bar(k, pdf, color='c')ax1.set_ylabel('概率', fontsize=16)ax1.yaxis.set_major_formatter(FuncFormatter(to_percent))# 绘制累积概率密度曲线ax2 = ax1.twinx()ax2.plot(k, cdf, '-r')ax2.set_ylabel('累积概率', fontsize=16)ax2.yaxis.set_major_formatter(FuncFormatter(to_percent))# 设置标题plt.title('我一周会写几篇文章?', fontsize=20)

这样,看起来就直观多了,我大概率下周会写5篇以内(含)。在下边的作图过程中,我们做了一些细节的调整,这些内容在我之前的文章中都有提到,如果不清楚或者忘记了,可以回去看一下《从零开始学Python可视化》、《一天一图学Python可视化》、《7天学会Python最佳可视化工具Seaborn》三个系列,它们的阅读顺序不分先后,可以随意调整顺序。

三、泊松分布随着λ增大的形态变化

接下来,我们看一下,随着λ的逐渐变大,其概率密度函数的形态会发生什么变化。

import numpy as npxs = np.arange(21)fig, ax = plt.subplots(figsize=(16, 10))for i in range(3, 10): plt.plot(xs, [poison_pdf(i, j) for j in xs],  '-', label=r'$\lambda={0}$'.format(i))ax.yaxis.set_major_formatter(FuncFormatter(to_percent))plt.legend();

可以看到,随着λ的逐渐增大,泊松分布的概率密度函数形态越来越接近正态分布。

标签: #泊松分布相应的程序算法 #泊松分布的典型应用