Beta分布从入门到精通

最近一直有点小忙,但是不知道在瞎忙什么,终于有时间把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中

时间: 2024-10-10 02:32:44

Beta分布从入门到精通的相关文章

2017最新技术java高级架构、千万高并发、分布式集群、架构师入门到精通视频教程

* { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架构师.集群.高可用.高可扩 展.高性能.高并发.性能优化.Spring boot.Redis.ActiveMQ.Nginx.Mycat.Netty.Jvm大型分布 式项目实战视频教程 视频课程包含: 高级Java架构师包含:Spring boot.Spring  cloud.Dubbo.Redis.ActiveMQ.Nginx.Mycat

Greenplum 分布式数据库开发入门到精通(架构、部署、管理、开发和调优)【课程分享】

Greenplum 分布式数据库开发入门到精通(架构.部署.管理.开发和调优) 对这个课程有兴趣的朋友,可以加我qq2059055336和我联系 课程大纲 1 Greenplum架构 什么是Greenplum Greenplum体系结构 Greenplum高可用性架构 2 安装Greenplum 配置环境 安装并初始化GPDB系统 启停数据库 配置GP系统 3 分布式数据库存储 数据是如何存储的 分布策略 4 GBDB查询处理 查询命令的执行 SQL查询处理机制 并行查询计划 5 角色权限及客户

Greenplum分布式数据库开发入门到精通

Greenplum分布式数据库开发入门到精通(架构.部署.管理.开发和调优)课程分类:Hadoop适合人群:初级课时数量:41课时用到技术:GP.MapReduce编程.装载和卸载数据涉及项目:角色权限及客户端认证管理咨询qq:1840215592双十一全场5折,前所未有的最低价,详情查看:http://www.ibeifeng.com/dou1111.html课程针对人群本课程适合于有一定java基础知识,对数据库和sql语句有一定了解,熟练使用linux系统的技术人员,特别适合于想换工作或寻

Word 2003从入门到精通第5讲(表格)

Word 2003从入门到精通第5讲(表格) 讲师 朱先忠 Part 0 概述 0.1 总体内容安排 0.2 表格学习四大难点 l      对齐问题 l      添加边框线 l      数据清单概念与排序 l      公式与计算 Part 1 创建表格 1.1 创建表格 1.1.1使用常用工具栏中的[插入表格]按钮 1.1.2使用[表格]菜单中的[插入]命令 1 在"自动调整"操作中: l   固定列宽:可在框中输入宽度值或使用微调按钮选择,若使用"自动"项

ARKit从入门到精通(11)-ARKit开发常见问题及解决方案

转载请注明出处:ARKit从入门到精通(11)-ARKit开发常见问题及解决方案 本文主要介绍ARKit开发过程中一些常见问题 1.ARKit框架无法导入问题 2.ARKit运行黑屏或者白屏问题:Unable to run the session, configuration is not supported on this device: <ARWorldTrackingSessionConfiguration 3.ARKit添加虚拟物体无法显示问题:ARSession不支持打断点 1.1-A

汇编语言从入门到精通-CPU资源和存储器

CPU资源和存储器 在汇编语言中,需要访问的硬件资源主要有:CPU内部资源.存储器和I/O端口.本章将着重讲解CPU内部寄存器的命名.功能及其常见的用途,还要介绍存储器的分段管理模式.存储单元地址的表示法以及其物理地址的形成方式. 2.1 寄存器组 寄存器是CPU内部重要的数据存储资源,是汇编程序员能直接使用的硬件资源之一.由于寄存器的存取速度比内存快,所以,在用汇编语言编写程序时,要尽可能充分利用寄存器的存储功能. 寄存器一般用来保存程序的中间结果,为随后的指令快速提供操作数,从而避免把中间结

火云开发课堂 - 《Shader从入门到精通》系列 第一节:Shader介绍与工程搭建

<Shader从入门到精通>系列在线课程 第一节:Shader介绍与工程搭建 视频地址:http://edu.csdn.net/course/detail/1441/22665?auto_start=1 交流论坛:http://www.firestonegames.com/bbs/forum.php 工程下载地址:请成为正式学员获取工程 课程截图: 项目实例: 版权声明:本文为博主原创文章,未经博主允许不得转载.

SaltStack 入门到精通 - 第一篇: 安装SaltStack

实际环境的设定: 系统环境: centos6 或centos5 实验机器: 192.168.1.100 软件需求: salt 套件,及其需求环境 实验目的: 成功安装salt,并实现salt主从间通讯 特殊设置: 其它目的: 安装SaltStack(下面简称为salt) epel安装:salt安装需要epel源支持,所以在安装salt前需要先安装epel包 # centos5 下载下面rpm  wget -O    epel.rpm https://dl.fedoraproject.org/pu

SaltStack 入门到精通 - 第七篇: Targeting

什么是Targeting? Targeting minions 是指那些minion会作为运行命令或是执行状态的目标.这些目标可以是一个主机名,系统信息,定义的分组,甚至是自定义的绑定的对象. 例如命令  salt web1 apache.signal restart 可以重启ID 为web1的minion的apache.当然也可以在top文件中使用web1来作为目标匹配的内容: base:   'web1':     - webserver Targing 有哪些匹配方式? Minion Id