(番外篇1)贝叶斯超参数的确定方法(附自适应搜索法、牛顿迭代法和二分查法的python实现)

迎新春舞曲(番外篇1)贝叶斯超参数确定⽅法(附⾃适应搜索法、⽜顿迭代法和⼆分查
法的python 实现)
(番外篇1) 贝叶斯超参数的确定⽅法(附⾃适应搜索法、⽜顿迭代法和⼆分查法的python 实现)
背景说明
在贝叶斯统计中,总体分布的参数不再被视为⼀个未知的常数处理,⽽是认为参数也有⼀个分布,事实上,由于是未知的不确定的东西,因此⽤概率分布的语⾔来描述是很有优势的。
参数⼀般需要先综合已有信息,确定好先验分布,然后利⽤新进的样本信息进⾏更新,从⽽得到后验分布,这个过程中如果与仍然是同⼀种分布,则称是总体分布参数的共轭先验分布,共轭先验分布具有很好的性质,体现在计算简单和具备可解释性上。常⽤的共轭先验分布有
总体分布参数共轭先验分布⼆项分布发⽣概率贝塔分布正态分布均值正态分布正态分布⽅差倒伽马分布泊松分布均值伽马分布指数分布
另一种温暖均值倒数
伽马分布
我们知道,⼆项分布在现实中是⼴泛存在的,因此当我们选择其先验分布为贝塔分布时(共轭),我们还需要给其两个参数赋予初始值,这就是超参数确定问题。
确定超参数的⼏个⽅法
1. 利⽤先验矩
2. 利⽤先验分位数
3. 利⽤先验矩和先验分位数
4. 其他⽅法
⼀个实例:⼆项分布参数p 的超参数确定
思路分析
θθθθπ(θ)π(θ∣x )π(θ)π(θ∣x )π(θ)θBe (α,β)
根据上⽂所讲的,⼆项分布的共轭先验分布为,我们将采⽤3. 利⽤先验分位数来确定。我们根据先验信息,知道了的两个分位数,⽐如为上下四分位数和,因此可以得到两个⽅程式:
由于我们关注的变量是和,因此上式可以抽象为
这是⼀个⾮线性⽅程组的零点问题。理论上,利⽤⽜顿迭代的⼆阶形式,在⼀定条件下,是可以求解此类问题的。但是这涉及到和的求导,是⽐较复杂的。
可以考虑从另⼀个⾓度来求解这个问题。⾸先这是⼀个超参数的初始值确定问题,因此结果并不要求⼗分的精准,我们可以在损失⼀定精度的前提下得到和的近似值。
因此我们可以在⼀个内对不同的和进⾏多轮计算,通过计算的精确程度来控制计算的时间。⽐如我们⼤概可以确定和的范围分别在和之间,那么就可以某个步长遍历这个,在遍历的过程中到使得最⼩的和,从⽽将得到的和视为⾮线性⽅程的近似解。由于和是关于和的连续函数,因此可以保证结果的可靠性。
python 代码实现
Be (α,β)θθL θU θ(1−θ)d θ=0.25∫0θL
Γ(α)Γ(β)Γ(α+β)
α−1β−1θ(1−θ)d θ=0.75
∫0θu Γ(α)Γ(β)Γ(α+β)
α−1β−1αβf (α,β)=01f (α,β)=0
2αβαβα−β平⾯αβαβ[1,100][1,100]α−β平⾯∥f ∥+1∥f ∥2αβαβf 1f 2αβ
import numpy as np
from scipy.integrate import quad
def gamma(alpha):
return quad(lambda x:x**(alpha-1)*np.exp(-x),0,np.inf)[0]
def Fbeta_q(alpha,beta,theta,q):
'''
本函数返回beta分布函数theta对应的概率值与理想的概率值q之间的差值绝对值
'''
k = gamma(alpha+beta)/(gamma(alpha)*gamma(beta))
integValue = quad(lambda x:x**(alpha-1)*(1-x)**(beta-1),0,theta)[0]文件管理系统
return abs(k*integValue-q)
def betaSolve(theta1,q1,theta2,q2,lowAlpha =0.1,highAlpha =20,lowBeta =0.1,highBeta =20,step =0.2):
'''
本函数接受两对分位数,返回计算近似到的beta分布的两个参数值及相应的误差
参数的意义如下:
theta1    q1    theta2    q2    为两对分位数
lowAlpha    highAlpha    lowBeta    highBeta    为两个参数的搜索范围,默认均为(0,20)
step    为搜索步长,默认为 0.2    (超参数的初始确定并不需要⼗分精确)
'''
AlphaPoints = np.arange(lowAlpha+0.1,highAlpha,step)
BetaPoints = np.arange(lowBeta+0.1,highBeta,step)
xAlpha,yBeta = np.meshgrid(AlphaPoints,BetaPoints)
minError = np.inf
数据波
minAlpha = np.NaN
minBeta = np.NaN
for i in range(len(AlphaPoints)):
for j in range(len(BetaPoints)):
currentError = Fbeta_q(alpha = xAlpha[i,j], beta = yBeta[i,j],theta = theta1, q = q1)\
+ Fbeta_q(alpha = xAlpha[i,j], beta = yBeta[i,j],theta = theta2, q = q2)
#print(xAlpha[i,j],yBeta[i,j],currentError,minError,(currentError < minError))
if(currentError < minError):
五星电器加盟
minAlpha = xAlpha[i,j]
minBeta = yBeta[i,j]
minError = currentError
return minAlpha,minBeta,minError
数据测试
我们已知的⼏组数据(上下四分位数)如下
Be(α,β)θLθU (1,1)0.250.75
(2,8)0.1070.274
(6,11)0.2240.368
(9,11)0.3720.526测试代码如下所⽰:
import  betaQuantile import  betaParameters if  __name__ == '__main__':
alpha ,beta ,error = betaParameters .betaSolve (theta1 = 0.25,q1 = 0.25,theta2 = 0.75,q2 = 0.75,step = 0.1,lowAlpha = 0.1,highAlpha = 5,lowBeta = 0.1,hig hBeta = 5)
print ('theta1 = 0.250','theta1 = 0.750','alpha = ',alpha ,'beta = ',beta ,'error = ',error )
alpha ,beta ,error = betaParameters .betaSolve (theta1 = 0.107,q1 = 0.25,theta2 = 0.274,q2 = 0.75,step = 0.1,lowAlpha = 0.1,highAlpha = 10,lowBeta = 0.1,highBeta = 10)
print ('theta1 = 0.107','theta1 = 0.274','alpha = ',alpha ,'beta = ',beta ,'error = ',error )
alpha ,beta ,error = betaParameters .betaSolve (theta1 = 0.224,q1 = 0.25,theta2 = 0.368,q2 = 0.75,step = 0.2,lowAlpha = 0.1,highAlpha = 20,lowBeta = 0.1,highBeta = 20)
print ('theta1 = 0.224','theta1 = 0.368','alpha = ',alpha ,'beta = ',beta ,'error = ',error )
alpha ,beta ,error = betaParameters .betaSolve (theta1 = 0.372,q1 = 0.25,theta2 = 0.526,q2 = 0.75,step = 0.2,lowAlpha = 0.1,highAlpha = 20,lowBeta = 0.1,highBeta = 20)
print ('theta1 = 0.372','theta1 = 0.526','alpha = ',alpha ,'beta = ',beta ,'error = ',error )
测试结果如下所⽰:
(1,1)(1.0,1.0)(2,8)(2.0,8.0)(6,11)(5.4,12.6)(9,11)
(8.8,10.8)
扩展:贝塔分布的上下四分位查询表格
对于任意已知的和,事实上我们都可以计算它的分位数。因此,我们可以对整数组合的和进⾏计算上下四分位数,从⽽可以通过查表的⽅式快速获得其整数近似值。
我们的问题实际上是求解⼀个⾮线性⽅程的零点
由于我们关注的变量是,因此上式可以抽象为
该⽅程必然有唯⼀实解,我们有两种⽅式可以求解该⽅程:1. 间接法(迭代法、⽜顿法)2. 直接法(⼆分法)
真实(α,β)
近似(α,β)
如何提高口语表达能力
αβαβθ(1−θ)d θ=p
∫0
θ
Γ(α)Γ(β)Γ(α+β)
α−1β−1θf (θ)=F (θ)−Be p =0
利⽤⽜顿迭代的话,需要对求导,这是简单的,其为
因此迭代式为
事实上,在这⾥⽤⽜顿法是不太合适的,根据⽜顿法的收敛条件,这⾥并不能保证其收敛到的零点(后⾯我们将看到有时会收敛到负值),因为其实在区间上并不是凸函数或凹函数。更合适的⽅法是利⽤⼆分法直接获得零点,因为我们已经知道其在区间上存在唯⼀的零点。⼆分法思想较简单,这⾥略去不
写。
求上下四分位点的python 实现
f (θ)f (θ)=′
=∂θ
∂F (θ)
Be f (θ)=Be θ(1−Γ(α)Γ(β)Γ(α+β)α−1θ)β−1θ:=θ−
f (θ)Be ′F (θ)
Be [0,1]F (θ)Be [0,1][0,1]

本文发布于:2024-09-22 01:40:43,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/397852.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:分布   参数   先验   确定   计算   共轭   问题
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议