近期一直有点小忙,可是不知道在瞎忙什么,最终有时间把Beta分布的整理弄完。

以下的内容。夹杂着英文和中文,呵呵~

Beta Distribution

Beta Distribution Definition:

The Beta distribution is a special case of the Dirichlet distribution, and is related to the Gamma distribution. It has the probability distribution function:

这里。由于Beta分数是二项分布的參数p的概率分布, 所以x(即p)的取值范围为0 <= x <= 1

where the normalisation, B, is thebeta function, Beta function could also be expressed by Gamma function:

Gamma函数 在实数域能够表示为:

Gamma函数 在整数域能够表示为:

Γ(n)=(n−1)!

Gamma函数有以下性质:

由于Beta函数能够表示为Gamma函数。所以Beta分布还能够表示为:

0 <= x <= 1

Beta分布能够理解为二项分布的參数p的分布,所以,这里又一次定义Beta分布:

Beta分布的期望:

Beta分布的方差:

Beta分布的 众数 mode:

Beta分布的偏度 Skewness:

Beta分布的 峰度 Kurtosis:

Beta Distribution Examples

Beta分布能够说是一个百变星君。依据參数a,b的不同,能够呈现出多种全然不同的概率分布图.

生成Beta分布的代码:

from scipy.stats import beta
import matplotlib.pyplot as plt
import numpy as np a, b = 2, 1 mean, var, skew, kurt = beta.stats(a, b, moments='mvsk') x = np.linspace(0, 1, 100)
plt.plot(x, beta.pdf(x, a, b), 'r-', lw=5, alpha=0.6, label='beta pdf')
plt.show()

然后,依据调整代码中的a,b的取值,能够得到不同的Beta分布:

a, b = 2, 1:

a, b = 2, 2

a, b = 8, 2

a, b = 0.01, 20

a, b = 1, 1

这样一个一个的绘制。是不是太逊了, 画在一起:

代码:

from scipy.stats import beta
import matplotlib.pyplot as plt
import numpy as np x = np.linspace(0, 1, 100) a_array = [1, 2, 4, 8]
b_array = [1, 2, 4, 8] fig, axarr = plt.subplots(len(a_array), len(b_array)) for i, a in enumerate(a_array):
for j, b in enumerate(b_array):
axarr[i, j].plot(x, beta.pdf(x, a, b), 'r', lw=1, alpha=0.6, label='a='+str(a)+',b='+str(b))
axarr[i, j].legend(frameon=False) plt.show()

将全部的Beta分布绘制在一个图上:

代码:

from scipy.stats import beta
import matplotlib.pyplot as plt
import numpy as np x = np.linspace(0, 1, 100) a_array = [1, 2, 4, 8]
b_array = [1, 2, 4, 8] for i, a in enumerate(a_array):
for j, b in enumerate(b_array):
plt.plot(x, beta.pdf(x, a, b), lw=1, alpha=0.6, label='a='+str(a)+',b='+str(b)) plt.legend(frameon=False)
plt.show()

Beta Mean

由公式能够得到,Beta分布的均值,也能够通过採样的方法,在一个Beta分布中,採样,计算均值。

代码:

import numpy as np
import numpy.random as nprnd
import scipy.stats as spstat
import scipy.special as ssp
import itertools as itt import matplotlib.pyplot as plt
import pylab as pl N = (np.arange(200) + 3) ** 2 * 20 betamean = np.zeros_like(N, dtype=np.float64) for idx, i in enumerate(N):
betamean[idx] = np.mean(nprnd.beta(2, 1, i)) plt.plot(N, betamean, color='steelblue', lw=2)
plt.xscale('log')
plt.show() print spstat.beta(2, 1).mean() print spstat.beta(2, 1).mean(), 2.0 / (2 + 1)
print spstat.beta(2, 1).var(), 2 * 1.0 / (2 + 1 + 1) / (2 + 1) ** 2

执行结果:

这里能够看到,随着採样点的添加。样本点的均值也就更加的收敛。更加的接近⅔,  ⅔ 是一个通过公式计算得到的。 这样,这个图片的结果也符合大数定理,随着採样点的添加。仅仅要样本点无限大。那么最终的均值就会无限的接近⅔.

Conjugate Prior

A conjugate prior,p(p), of a likelihood, p(x|p), is a distribution that results in a posterior distribution, p(p|x)with the same functional form as the prior
and a parameterisation that incorporates the observationx.

这句话,猛的一读,晕头转向,可是,细致读上三五遍,基本上就理解了什么叫“共轭先验”。

基本上说,一个參数的共轭先验p(p)是这种一个分布:在这个分布的基础上加上观測样本能够得到一个与先验分布具有同样的函数形式的后验概率分布p(p|x),而且这个后验概率分布p(p|x)融合了观測样本x

也就是说共轭先验p(p)和后验概率分布p(p|x)具有相当的函数形式。

说点人话吧。。。

Beta分布是二项分布的參数p的共轭先验。也就是说,二项分布的參数p的共轭先验是一个Beta分布,当中,Beta分布中的两个參数a,b能够看作两个二项分布的參数p的先验知识,能够称为伪计数,比如
a, b = 2, 1, 这就意味着,二项分布的參数p的先验知识为:在三次实验中,a出现两次,b出现1次,也能够理解为发生了2次,没有发生的有1次。

后验概率也符合Beta分布:

Beta(p|a, b) + count(m1, m2) = Beta(p| a+m1, b+m2)

在二项分布的參数的先验分布的基础上,加上观測数据。就能够得到二项分布的參数p的后验概率分布也符合Beta分布。这里,
m1, m2 分别表示相应于 x=1 和 x=0在观測数据中出现的次数。

话说,共轭先验中的參数即Beta分布中的两个參数a,b 是很有意义的hyperparameter的解释。前面已经提到了,a,b
能够理解为在观測样本 (m1, m2)的基础上的先验知识,或者能够理解为伪计数,即在我们的先验知识中, x=1和x=0分别应该出现多少次。而且。这个先验知识的取值,对于后验概率的计算有比較大的影响。

二项分布的參数p的后验概率分布仍然符合Beta分布能够通过以下的公式推到进行证明:

以下给出上面公式的推导过程:

假定集合C是服从N Bernoulli分布的一个集合。当中c=1或者c=0。那么能够依据贝叶斯參数预计计算集合C
的后验參数预计:

所以,由上面的推导能够证明二项分布的參数p的后验概率分布也服从Beta分布。

当中。上面公式中的Z能够进行例如以下推导:


公式2中用到了一个Beta分布的公式Beta函数:

所以,公式2中

最新文章

  1. iOS开发系列--C语言之数组和字符串
  2. Hadoop笔记
  3. csharp: 用Enterprise Library对象实体绑定数据
  4. 【原创】storyboard启动应用程序的大致流程
  5. CentOS6.5系统软件仓库及挂载NTFS
  6. c/c++工程中外部头文件及库添加方法
  7. ArcGIS Server 10.2 实战(二)动态修改要素数据的地理处理服务
  8. BOM的来源是不可能出现的字符,GB2312双字节高位都是1,Unicode理论的根本缺陷导致UTF8的诞生
  9. php中__clone() shallow copy 只是浅复制
  10. Android事件分发机制详解
  11. 高性能Ajax
  12. @Controller 类中初始化问题解决办法
  13. 多线程使用Lock实现生产者实现者代码
  14. Android 四种常见的线程池
  15. LeetCode算法题-Baseball Game(Java实现)
  16. C#学习笔记(2)
  17. linux查找指定目录文件大小
  18. PyCharm提交代码到git
  19. css3实现单行文本溢出显示省略号
  20. Spring Test, JUnit, Mockito, Hamcrest 集成 Web 测试

热门文章

  1. Vue-cli 3.0 构建项目
  2. luogu P4137 Rmq Problem / mex(可持久化线段树)
  3. 紫书 例题8-16 UVa 1608 (递归)
  4. Java基础学习总结(44)——10个Java 8 Lambda表达式经典示例
  5. 批量修改文件的编码格式至UTF-8
  6. drupal7 怎样将一个date字段加入上日期插件效果
  7. OC中的@的作用研究
  8. 三角函数之美-水波纹载入LoadingView
  9. 为什么button在设置标题时要用一个方法,而不像lable一样直接用一个属性
  10. 10.Intellij IDEA svn的使用详解