- 连续变量分布
- 离散变量分布
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函数,实现任意想要的离散分布。
https://docs.scipy.org/doc/scipy/tutorial/ ↩︎