python计算概率密度,累计分布,逆函数的例子

  

<强>计算概率分布的相关参数时,一般使用scipy包,常用的函数包括以下几个:

  

pdf:连续随机分布的概率密度函数

  

及:离散随机分布的概率密度函数

  

提供:累计分布函数

  

百分位函数(累计分布函数的逆函数)

  

生存函数的逆函数(1 -它的逆函数)

  

函数里面不仅能跟一个数据,还能跟一个数组。下面用正态分布举例说明:

        在在在进口scipy。统计数据作为圣      在在在st.norm.cdf(0) #标准正态分布在0处的累计分布概率值   0.5      在在在st.norm。提供([1,0,1])#标准正态分布分别在1 0 1处的累计分布概率值   阵列((0.15865525,0.5,0.84134475))      在在在st.norm.pdf(0) #标准正态分布在0处的概率密度值   0.3989422804014327      在在在st.norm.ppf(0.975) #标准正态分布在0.975处的逆函数的值   1.959963984540054      在在在st.norm.lsf(0.975) #标准正态分布在0.025处的生存函数的逆函数的值   1.959963984540054   之前      

对于非标准正态分布,通过更改参数loc与规模来改变均值与标准差:

        在在在st.norm。提供(0,loc=2、规模=1)#均值为2,标准差为1的正态分布在0处的累计分布概率值   0.022750131948179195      

对于其他随机分布,可能更改的参数不一样,具体需要查官方文档。下面我们举一些常用分布的例子:

        在在在st.binom。及(4 n=100, p=0.05) #参数值n=100, p=0.05的二项分布在4处的概率密度值   0.17814264156968956      在在在st.geom。及(4 p=0.05) #参数值p=0.05的几何分布在4处的概率密度值   0.04286875      在在在st.poisson。及(2μ=3)#参数值μ=3的泊松分布在2处的概率密度值   0.22404180765538775      在在在st.chi2.ppf (0.95, df=10) #自由度为10的卡方分布在0.95处的逆函数的值   18.307038053275146      在在在st.t.ppf (0.975, df=10) #自由度为10的t分布在0.975处的逆函数的值   2.2281388519649385      在在在st.f.ppf (0.95, dfn=2,目前企业=12)#自由度为2,12 F的分布在0.95处的逆函数的值   3.8852938346523933   之前      

  

实现的方法可以不止一种:

  
  

拒绝抽样   

转化提供   

大都市算法(密度)

     

本篇介绍根据累积概率分布函数的逆函数(CDF) 2:反生成的方法。

  

自己的理解不一定正确,有错误望指正。

  

<强>目标:

  

已知y=pdf (x),现想由给定的pdf,生成对应分布的x

  

PDF是概率分布函数,对其积分或者求和可以得到CDF(累积概率分布函数),PDF积分或求和的结果始终为1

  

<强>步骤(具体解释后面会说):

  

1,根据pdf得到cdf实验组的

  

2,由cdf得到的逆cdf实验组的

  

3,对于给定的均匀分布(0,1),带入逆运作,得到的结果即是我们需要的x

  

<强>求cdf实验组的逆函数的具体方法:

  

对于上面的第二步,可以分成两类:

  

1,当CDF的逆函数好求时,直接根据公式求取,

  

2,反之当它的逆函数不好求时,用数值模拟方法

  

<>强自己的理解:为什么需要根据它的逆去获得x ?

  

原因一:

  

因为它是单调函数因此一定存在逆函数(它是s型函数,而pdf则不一定,例如正态分布,不单调,对于给定的y,可能存在两个对应的x,就不可逆)

  

原因二:

  

这仅是我自己的直观理解,根据下图所示(左上为pdf,右上为cdf)

  

 python计算概率密度,累计分布,逆函数的例子

  

由步骤3可知,我们首先生成(0,1)的均匀随机数,此随机数作为cdf的y去映射到提供的x(若用它的逆函数表示则是由x映射到y),可以参考上图的右上,既然cdf实验组的y是均匀随机的,那么对于cdf实验组中同样范围的x,斜率大的部分将会有更大的机会被映射,因为对应的y范围更大(而y是随即均匀分布的),那么,它的斜率也就等同于pdf的值,这正好符合若x的pdf较大,那么有更大的概率出现(即重复很多次后,该x会出现的次数最多)

  

<强>代码实现,方法一,公式法

        进口numpy np   导入数学   进口随机   进口matplotlib。pyplot作为plt   进口集合      count_dict=dict类型()   bin_count=20      def inverseCDF ():   ”“”   返回PDF的x值   ”“”   uniform_random=random.random ()   返回inverse_cdf (uniform_random)         def pdf (x):   返回2 * x      # cdf=x ^ 2其逆函数很好求,因此直接用公式法   def inverse_cdf (x):   返回math.sqrt (x)         def draw_pdf (D):   全球bin_count   D=collections.OrderedDict(排序(D.items ()))   plt.bar(范围(len (D)),列表(D.values()),对齐=爸行摹?   #因为映射本的时候采用的地板操作,因此加0.5上   value_list=[(键+ 0.5)/bin_count关键D.keys ())   plt.xticks(范围(len (D)), value_list)   plt。包含(“x”,字形大?5)   plt。ylabel(“计数”,字形大?5)   plt。标题(“计算位”)   plt.show ()      因为我在范围(90000):   x=inverseCDF ()   #用本去映射,否则不好操作   本=数学。地板(x * bin_count) #类型(本):int   count_dict(本)=count_dict。get(本,0)+ 1      draw_pdf (count_dict)   

python计算概率密度,累计分布,逆函数的例子