$\Beta$分布推导与可视化
$\Gamma$函数
$\Gamma$函数(Gamma函数)是阶乘函数在实数和复数域的扩展。对于正整数$n$,阶乘函数表示为$n! = 1 \times 2 \times ... \times n$。然而,这个定义仅适用于正整数。Gamma函数的目的是将阶乘扩展到实数和复数域,从而计算实数和复数的“阶乘”。$\Gamma$函数定义如下:
$\displaystyle \Gamma(x) = \int_0^\infty t^{x-1}e^{-t} dt $
其中,$x$是一个复数,定义域是$\{x|x\in C- Z^--\{0\}\}$,也就是除了负整数和$0$之外的所有复数。通过这个定义,$\Gamma$函数可以用来计算实数和复数的“阶乘”。在实数域与复数域的可视化如下:
![]() |
![]() |
$\Gamma$函数具有以下性质:
1、对于正整数$n$,有$\Gamma(n) = (n - 1)!$。这表明$\Gamma$函数在正整数上与阶乘函数相符。
2、$\Gamma$函数满足递推关系:$\Gamma(x + 1) = x\Gamma(x)$(注意和整数阶乘的联系)。
3、$\Gamma$函数用于定义很多常见的概率分布,如$\Gamma$分布、Beta分布和t分布等。
$\Beta$分布
基于伯努利实验的推导
$\Beta$分布(Beta分布)与伯努利试验相关。在伯努利试验中,假设硬币朝上的概率为$p$。当抛$a+b$次硬币,硬币朝上的次数为$a$时,计算该情况的概率为
$ \displaystyle C_{a+b}^ap^a(1-p)^b$
上式表示二项分布在这一事件(即$a+b$次实验,$a$次正面)下的概率。则$\Beta$分布表示:把概率$p$看做随机变量,固定$a,b$,发生相应事件的概率分布。为了获取$\Beta$分布的概率密度,需要计算以上概率关于$p$的积分的归一化系数$k$,使得:
$\displaystyle k \int_0^1C_{a+b}^ap^a(1-p)^b dp=1$
推导出
$\displaystyle k =\left(\int_0^1C_{a+b}^ap^a(1-p)^b dp\right)^{-1}=a+b+1 $
以上积分我不会算,但是可以通过以下程序来验证。
from scipy.special import comb def Int(func, l, h, n=1000): #模拟定积分
a = np.linspace(l, h, n)
return func(a).sum()*(h-l)/n
a, b = 5, 2 #取任意整数
k = a + b + 1
def func(x):
return comb(a+b, a) * (x**a) *((1-x)**b)
Int(func, 0, 1) * k # = 1
获得概率密度函数:
$ \begin{align} f(p; a, b)&=(a+b+1)C_{a+b}^ap^a(1-p)^b\\ &=\frac{(a+b+1)!}{a!b!}p^a(1-p)^b\\ \end{align} $
把阶乘拓展为$\Gamma$函数,上式就变成
$ \begin{align}f(p; a, b)= \frac{\Gamma(a+b+2)}{\Gamma(a+1)\Gamma(b+1)}p^a(1-p)^b\end{align}$
令$a=\alpha-1,b=\beta-1,p=x$,就可以得到常见的$\Beta$分布的密度函数表示形式:
$ \begin{align}\displaystyle f(x;\alpha,\beta)=\frac{\Gamma(\alpha+\beta)}{\Gamma(\alpha)\Gamma(\beta)}x^{\alpha-1}(1-x)^{\beta-1}=\frac{1}{\Beta(\alpha,\beta)}x^{\alpha-1}(1-x)^{\beta-1}\end{align}$
其中$\alpha>0,\beta>0,0<x<1$。关于均值、方差什么的这里就不赘述了。
联合概率密度
正整数情况
关于(2)式,我们把其中的$a,b,p$都看作随机变量,再除以一个归一化系数,就可以构成这三个随机变量的联合概率密度,从而可以非常直观地理解$\Beta$分布。分别固定抽样次数$n=0,1,2,5,10,15$,可视化如下:
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
其中,当以抽样概率$p$为条件时,在y轴上,就是离散的关于$a$的二项分布。当以$a$为条件时,在x轴上,就是连续的关于$p$的$\Beta$分布。可以观察到,当$a<b$时,$\Beta$分布左偏,否则右偏,在$n=0$时,变为均匀分布。
此外,当在y轴方向上进行求和,可以得到$p$的边缘分布,为均匀分布;而当在x轴方向上进行积分,得到$a$的边缘分布,也是均匀分布。但感觉边缘分布似乎没有什么意义,不知理解是否正确。可视化代码如下:
import matplotlib.pyplot as plt
from scipy.special import gamma
import numpy as np
import matplotlib
matplotlib.rcParams['font.family'] = 'Times New Roman' def Beta(a, b, p):
g1, g2, g3 = gamma(a+b+2), gamma(a+1), gamma(b+1)
return g1/(g2*g3) * p**(a) * (1-p)**(b)
def BetaHot(n, samp_n = 1000):
p = np.linspace(0, 1, samp_n)
a = np.linspace(0, n, n+1)
P, A = np.meshgrid(p, a) Z = Beta(A, n-A, P)/(n+1)
per_width = samp_n//(n+1)
Z1 = np.repeat(Z, per_width, 0)
# 热力图
plt.imshow(Z1, origin='lower', cmap='Blues')
plt.colorbar()
# 关于p的密度图
for i, t in enumerate(Z):
plt.plot(np.linspace(-0.5, samp_n-0.5, samp_n), i*per_width+per_width*t-0.5, '--', c='red')
# 绘图设置
plt.xlabel("p")
plt.ylabel('a')
old_yticks = np.linspace(per_width/2-0.5, Z1.shape[0]-0.5-per_width/2, n+1)
plt.yticks(old_yticks, [f'{i:.0f}' for i in np.linspace(0, n, n+1)])
old_xticks = np.linspace(-0.5, samp_n-0.5, 6)
plt.xticks(old_xticks, [f'{i:.1f}' for i in np.linspace(0, 1, 6)])
plt.ylim([0, samp_n+4])
plt.title("n = a + b = %d"%n)
plt.savefig('img/n = %d.png'%n)
plt.show() for n in [0, 1, 2, 5, 10, 15]:
BetaHot(n)
一般情况
以上可视化的是$a,b$取为正整数时$\Beta$分布的情况,即(2)式。对于更一般的情况(4)式,即取$\alpha,\beta$为大于0的实数,在(3)式中就是$a>-1,b>-1$,尽管并不符合真实伯努利试验的情况,但仍可以计算。可视化如下:
|
![]() |
![]() |
![]() |
![]() |
![]() |
可以看出,$a,b$都小于0时,密度函数会变成U形。且依旧是,$a$相比$b$越小,形状越往左偏。可视化代码如下:
import matplotlib.pyplot as plt
from scipy.special import gamma
import numpy as np
import matplotlib
matplotlib.rcParams['font.family'] = 'Times New Roman' def Beta(a, b, p):
g1, g2, g3 = gamma(a+b+2), gamma(a+1), gamma(b+1)
beta = g1/(g2*g3) * p**(a) * (1-p)**(b)
return beta for n in [-1, 0, 1, 2, 5, 10]:
for a in np.linspace(-0.9, n+0.9, 3):
p = np.linspace(0.0001, 0.9999, 300)
b = n-a
y = Beta(a, b, p)
plt.plot(p, y, label="a = %.1f, b = %.1f"%(a, b))
plt.legend(loc='upper center')
plt.ylim([-0.1, 3])
plt.title('a + b = %.1f' % n)
plt.savefig('img/a + b = %.1f.png' % n)
plt.show()
参考
1. 共轭先验: https://www.zhihu.com/question/41846423?sort=created
随机推荐
- 打开CMD的方式
打开Cmd的方式: 1.开始+系统+命令提示符 2.Win键+R 3.在任意文件夹下,按住Shift键+鼠标右键点击,在此处打开命令行窗口 4.资源管理的地址栏前面加上Cmd路径 管理员运行方式 :系 ...
- C语言初级阶段4——数组3——字符数组
C语言初级阶段4--数组3--字符数组 字符数组的定义:储存字符类型数据的集合 1.注意:如果用字符串给字符数组初始化,那么不需要{},但是要有"". 2.%s :用来输出字符串的 ...
- 点击按钮触发div颜色改变的几种写法
目录 JavaScript 行内事件 onclick绑定 关于选取元素 关于改变颜色 addEventListener jQuery 获取元素 绑定事件 设置样式 css() 添加class Vue ...
- vscode工程目录文件及文件夹摘选
在工程工作区下新建一个.vscode 文件夹中并新建一个名为"settings.json"的文件,然后在 settings.json 中输入如下内容: { "search ...
- 转发 关于Windows安装解压版MySQL出现服务正在启动-服务无法启动的问题
部分转自 :https://blog.csdn.net/u013901768/article/details/80707307 我是从服务器上复制了mysql的整个目录,到本地,然后怎么也不好用,看了 ...
- protobuf怎么处理java中的Object和Object[],protobuf的bytestring和object[]
如题,作者一开始也遇到了这个比较棘手的问题. 话不多说,直接说解决方案. 这里使用bytestring,如果是object[]的话则用repeated定义即可. 那么问题又来了,用这个类型怎么做到与j ...
- CSS3之动画三大特性
一 过渡模块 1 基本使用 1,过渡三要素1.1必须要有属性发生变化1.2必须告诉系统哪个属性需要执行过渡效果1.3必须告诉系统过渡效果持续时长 2.注意点当多个属性需要同时执行过渡效果时用逗号隔开即 ...
- layui tree 未命名 所遇到的坑
由于传入类型不对,需要传入object类型,我传入的是String类型,所以出现了 一堆未命名, 在控制台输出查看,是一模一样的,困扰了我一下午,再次感谢老哥 参考自:https://www.cnbl ...
- Spring--依赖注入:setter注入和构造器注入
依赖注入:描述了在容器中建立Bean于Bean之间依赖关系的过程 setter注入 在本来已经在service里面引用了bean的相关方法的基础上,再引用之前已经写过的userDao的对象,即在ser ...
- 【SpringBoot】还不会SpringBoot项目模块分层?来这手把手教你
前言 缘由 经常看到网上很多优秀的开源项目中,代码简洁,模块分层完美.反观自己代码层级混乱,,却不知如何整理分层.此文手把手教你一步一步创建模块,左手右手一个慢动作.结合本人实际开发及个人项目中分层思 ...