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://www.toymoban.com/news/detail-586557.html
-
https://docs.scipy.org/doc/scipy/tutorial/ ↩︎文章来源地址https://www.toymoban.com/news/detail-586557.html
到了这里,关于Python Scipy 自定义任意的概率分布的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!