<强>计算概率分布的相关参数时,一般使用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)
由步骤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计算概率密度,累计分布,逆函数的例子