matplotlib 可视化概率密度函数(pdf)和累计分布函数(cdf)

  • A+
所属分类:python数据分析
摘要在这一篇中会介绍概率密度函数(pdf)和累计分布函数(cdf),同时使用 Matplotlib 对其进行可视化。

简介

在这一篇中我们会简单介绍一些常用分布的概率密度函数(pdf)累计分布函数(cdf),同时使用 matplotlib 将其进行可视化。

参考连接

 

PDF 和 CDF 的介绍

概率密度函数(probability density function, pdf)通常用来描述连续随机变量的概率分布。可以得到连续变量去某个值时,他的概率是多少。

我们可以使用在 scipy.stats 中使用不同的概率分布,例如我们可以计算正态分布 N(0, 1)P(x=1) 时候的值,这里使用 norm.pdf 来计算:

  1. from scipy.stats import norm
  2. mean = 0
  3. std = 1
  4. norm.pdf(0, mean, std)
  5. """
  6. 0.3989422804014327
  7. """

有的时候我们需要计算 down<x<up 的概率,或是 x<X 的概率,这个时候直接使用 pdf(概率密度函数)计算比较麻烦(需要计算面积,积分)。

为了便于计算概率,我们引入累积分布函数 (cumulative distribution function)。例如我们希望计算正态分布 N(0, 1)F(x=1)=P(x<1) 时候的值,则会有:

  1. mean = 0
  2. std = 1
  3. norm.cdf(1, mean, std)
  4. """
  5. 0.8413447460685429
  6. """

这里 F(x=1)=P(x<1) 表达的意思就是计算下图阴影的面积:

matplotlib 可视化概率密度函数(pdf)和累计分布函数(cdf)

 

使用 Matplotlib 可视化 pdf 和 cdf

上面我们分别介绍了 pdf 和 cdf,下面来对其进行可视化。我们会对不同的连续分布的 pdf 和 cdf 进行可视化。

正态分布

我们利用上面介绍的 norm.pdf 和 norm.cdf 来生成指定的值,并绘制为折线图。

  1. # 绘制 pdf 和 cdf 的函数
  2. mean = 0
  3. std = 1
  4. fig = plt.figure()
  5. ax = fig.add_subplot(1,1,1)
  6. x_index =  np.linspace(-3, 3, 100)
  7. data_pdf_data = [norm.pdf(i, mean, std) for i in x_index] # pdf 数据
  8. data_cdf_data = [norm.cdf(i, mean, std) for i in x_index] # cdf 数据
  9. ax.plot(x_index, data_pdf_data, color='b', label='pdf')
  10. ax_twin = ax.twinx() # 次坐标
  11. ax_twin.plot(x_index, data_cdf_data, color='g', label='cdf')
  12. ax.legend()
  13. ax_twin.legend()

最终的结果如下所示,这里正态分布的均值为 0,方差为 1。

matplotlib 可视化概率密度函数(pdf)和累计分布函数(cdf)

 

均匀分布

同样,我们只需要修改为 uniform.pdf 和 uniform.cdf 就可以绘制出均匀分布的 pdf 和 cdf 的图像。需要注意的是,这里设置的 loc 表示的为起点,scale 表示终点,最终的 uniform distribution 的范围是在 [loc, loc+scale].

  1. from scipy.stats import norm, uniform
  2. # ########################
  3. # 绘制均匀分布的 pdf 和 cdf 的函数
  4. # ########################
  5. loc = 0
  6. scale = 6 # [loc, loc + scale]
  7. fig = plt.figure()
  8. ax = fig.add_subplot(1,1,1)
  9. x_index =  np.linspace(-3, 9, 100)
  10. data_pdf_data = [uniform.pdf(i, loc, scale) for i in x_index] # pdf 数据
  11. data_cdf_data = [uniform.cdf(i, loc, scale) for i in x_index] # cdf 数据
  12. ax.plot(x_index, data_pdf_data, color='b', label='pdf')
  13. ax_twin = ax.twinx() # 次坐标
  14. ax_twin.plot(x_index, data_cdf_data, color='g', label='cdf')
  15. ax.legend()
  16. ax_twin.legend()

最终的结果如下图所示,可以看到当 x 在 0-6 之间时,pdf 的值为固定值;cdf 在 x=6 的时候取值为 1:

matplotlib 可视化概率密度函数(pdf)和累计分布函数(cdf)

 

指数分布

指数分布只需要使用 expon.pdfexpon.cdf 即可。

  1. from scipy.stats import norm, uniform, expon
  2. # 绘制 pdf 和 cdf 的函数
  3. loc = 0
  4. scale = 2 # pdf = lambda * exp(-lambda * x), scale = 1 / lambda
  5. fig = plt.figure()
  6. ax = fig.add_subplot(1,1,1)
  7. x_index =  np.linspace(0, 9, 100)
  8. data_pdf_data = [expon.pdf(i, loc, scale) for i in x_index] # pdf 数据
  9. data_cdf_data = [expon.cdf(i, loc, scale) for i in x_index] # cdf 数据
  10. ax.plot(x_index, data_pdf_data, color='b', label='pdf')
  11. ax_twin = ax.twinx() # 次坐标
  12. ax_twin.plot(x_index, data_cdf_data, color='g', label='cdf')
  13. ax.legend()
  14. ax_twin.legend()

最终的效果如下图所示:

matplotlib 可视化概率密度函数(pdf)和累计分布函数(cdf)
  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: