概率统计Python计算:自定义连续型分布

本文介绍了如何使用Python的scipy.stats库中的rv_continuous类创建一个连续型随机变量分布,以向圆内随机投掷点为例,详细讲解了如何通过重载累积分布函数(cdf)来定义分布,并展示了分布函数和密度函数的绘制。
摘要由CSDN通过智能技术生成

在这里插入图片描述
与rv_discrete类相仿,scipy.stats还提供了一个表示连续型分布的rv_continuous类。使用rv_continuos类自定义连续型分布甚至比用rv_discrete类自定义离散型分布更简单:只需要自定义分布的累积概率函数(分布函数)cdf即可。
例如,在《随机变量的分布函数》博文的例1中,我们曾遇到向半径为 r r r的圆内投掷一点,点到圆心距离的随机变量 X X X的分布函数为
F ( x ) = { 0 x < 0 x 2 r 2 0 ≤ x ≤ r 1 x > r {F(x)=}\begin{cases} 0&x<0\\ \frac{x^2}{r^2}&0\leq x\leq r\\ 1&x>r \end{cases} F(x)= 0r2x21x<00xrx>r
并在那里用Python定义了此 F ( x ) F(x) F(x)函数。在此基础上,下列代码创建了一个以 F ( x ) F(x) F(x)为累积概率函数的连续型分布xdist类,及该类的一个对象dist1。并绘制服从该分布的随机变量的分布函数和密度函数图形。

from scipy.stats import rv_continuous       #导入rv_continuous
import numpy as np                          #导入numpy
from matplotlib import pyplot as plt        #导入绘图对象plt
class xdist(rv_continuous):                 #自定义分布xdist
    def _cdf(self, x, r):                   #累积分布函数
        y=np.zeros(x.size)                  #函数值初始化为0
        d=np.where((x>=0)&(x<=r))           #x中介于0~r的部分
        y[d]=((x[d])/r[d])**2               #x介于0~r对应的函数值
        d=np.where(x>r)                     #x中大于r的部分
        y[d]=1                              #x中大于r对应的函数值
        return y
dist1=xdist()                               #创建xdist类对象dist1
x=np.linspace(-0.5, 5, 256)                 #绘图的横坐标区域
plt.plot(x, dist1.cdf(x, 4))                #绘制dist1的分布函数图像
plt.show()

程序中,第4~11行定义继承于rv_continuous的连续型分布类xdist。Python是一个面向对象的程序设计语言。在Python中顶一个类,其语法为
class 类名[(父类名)]:
\quad 类定义体
类定义体内定义所属的各函数。在上列程序中,所定义的类名为xdist,父类名为rv_\continuous(第1行导入)。这意味着xdist继承自连续型分布rv_continuous类。第5~11行的类定义体中仅定义了服从该xdist分布的随机变量的累积概率函数cdf。由于cdf是父类rv_continuous中已定义的函数,此处是对其进行重载,故在函数名之前加上下划线“_”。该函数有三个参数self,x和r,前者表示该函数为对象函数,从属于该类的每一个对象。x表示接受外部传递的自变量,r表示圆半径。仔细观察不难发现,cdf的定义与博文《随机变量的分布函数》中例1的函数cdf(x,r)的定义非常相似,不同点在于首尾省略了对有自变量是单值情形的特殊处理。这是因为scipy.stats中各概率分布类中的函数参数设置为array_like类型,它会自动地将单值参数转换成数组类型,相应地将对应的返回值转换成单值。
第12行用所定义的xdist类创建对象dist1。第13行设置绘图区域x,第14行绘制分布函数对应r=4的图形。对这两行中numpy(第2行导入)的linspace函数和matplotlib.pyplot(第3行导入)的plot函数的说明详见博文《随机变量的分布函数》。运行该程序将显示 X X X的分布函数 F ( x ) F(x) F(x)的图像(见下图)。
在这里插入图片描述

一旦定义了分布xdist的分布函数cdf,系统会自动的生成概率密度函数pdf。如果我们把程序的第14行代码换成

plt.plot(x, dist1.pdf(x, 4))                 #绘制dist1的密度函数图像

则程序将显示xdist分布的概率密度函数pdf对应r=4的图型(见下图)。
在这里插入图片描述
完全符合密度函数 f ( x ) = { 2 x r 2 0 ≤ x ≤ r 0 其他 . f(x)=\begin{cases}\frac{2x}{r^2}&0\leq x\leq r\\0&\text{其他}\end{cases}. f(x)={r22x00xr其他.
注意,在我们的代码中没有为pdf函数的定义做任何事情!
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!
代码诚可贵,原理价更高。若为AI学,读正版书好
返回《导引》

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值