栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > Python

Python Scipy 自定义任意的概率分布

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python Scipy 自定义任意的概率分布

Python Scipy 实现任意的概率分布
  • 连续变量分布
  • 离散变量分布

Scipy自带了多种常见的分布,如正态分布、均匀分布、二项分布、多项分布、伽马分布等等1,还可以自定义任意的概率分布。本文将介绍如何利用Scipy自定义任意的概率分布。

连续变量分布

考虑连续变量x满足如下概率密度分布函数:

其在实数域积分为1。我们可以通过scipy.stats中的rv_continuous类去实现这个分布,代码如下:

from scipy.stats import rv_continuous
import matplotlib.pyplot as plt
import numpy as np
class MyDistribution(rv_continuous):
    def _pdf(self, x):#概率密度分布函数
        return 2*sqrt(0.1)*exp(-0.1*x**2)*cos(x)**2/(sqrt(pi)*(exp(-10) + 1))
distribution = MyDistribution()
xlist=np.linspace(-8,8,300)
ylist=distribution.pdf(xlist)
samples=distribution.rvs(size=200);#取200次样

fig,ax=plt.subplots(figsize=(8,6))
ax.plot(xlist,ylist,lw=3,color='red',label="$mathrm{ideal}$");
ax.hist(samples,color='blue',density=True, bins=np.arange(-8,8,0.25), histtype='barstacked', rwidth=0.9,label=r"$mathrm{samples}$")
ax.legend(fontsize=20);
ax.set_xlabel(r"$x$",size=25)
ax.set_ylabel(r"$mathrm{PDF}$",size=20)
ax.set_xlim(-8,8);
ax.tick_params(axis='both',direction='in',width=1.3,length=3,top=1,right=1,labelsize=20,pad=2)
fig.tight_layout();
fig.show();

运行结果如下:

增加采样次数,分布直方图逐渐趋于理想的概率分布函数P(x)。

离散变量分布

考虑连续变量x满足泊松分布,则可以用scipy.stats中的rv_discrete类去实现这个分布,代码如下:

from scipy.stats import rv_discrete
import matplotlib.pyplot as plt
import numpy as np
from scipy.special import factorial
class MyDistribution(rv_discrete):
    def _pmf(self, k, mu):
        return exp(-mu)*mu**k/factorial(k)
distribution = MyDistribution()
mu=2
samples=distribution.rvs(size=500,mu=mu);#取500次样
klist = np.arange(0,10,1)
plist = distribution.pmf(klist,mu)
fig, ax = plt.subplots()
ax.plot(klist, plist, 'ro', ms=12, mec='r',label="$mathrm{ideal}$");
ax.hist(samples,color='blue',density=True, bins=klist, histtype='barstacked', rwidth=0.8,label=r"$mathrm{samples}$",align="left")
ax.legend(fontsize=20);
fig.show();

运行结果如下:

可以修改上述MyDistribution类中的pmf函数,实现任意想要的离散分布。


  1. https://docs.scipy.org/doc/scipy/tutorial/ ↩︎

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1037010.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号