拓端tecdat|PYTHON贝叶斯推断计算:用BETA先验分布推断概率和可视化案例

技术拓端tecdat|PYTHON贝叶斯推断计算:用BETA先验分布推断概率和可视化案例 拓端tecdat|PYTHON贝叶斯推断计算:用BETA先验分布推断概率和可视化案例原文链接:http://te

扩展技术|PYTHON贝叶斯推理计算:用BETA先验分布推断概率和可视化案例。

原文链接:http://tecdat.cn/p=24084

原文出处:拓端数据部落公众号

在本文中,我将扩展从数据中推断概率的示例,并考虑0到1之间的所有(连续)值,而不是一组离散的候选概率。这意味着我们的先验(和后验)现在是概率密度函数(pdf),而不是概率质量函数(pmf)。

我考虑了从数据序列推断p0,即零的概率:

我使用p0的不同先验来解决同一个问题,它允许0到1之间的连续值,而不是一组离散的候选值。

概率

我们推理问题的起点是可能性——中观察到的数据序列的概率,写起来好像我知道p0的值:

为了清楚起见,我们可以插入p0=0.6,并找到给定未知概率值的指定数据序列的概率:

概率的更一般的形式是,它并不特定于所考虑的数据序列。

其中n0是零的数量,n1是所考虑的任何数据序列d中的1的数量。

先验 - Beta 分布

我们使用beta分布来表示我们先前的假设/信息。数学形式是:

其中,0和1是我们必须设置的超参数,反映了我们关于p0值的假设/信息。但是,我们只需要把p0看作我们要推断的参数——,忽略了这个参数是概率。

请注意后验 pdf 也将是 Beta Distribution,所以它值得尝试适应pdf。

大多数先验均值——人想要一个数字或点数来表示推理结果或包含在先验中的信息。然而,在贝叶斯推理方法中,先验和后验都是pdf或pmf。得到点估计的一种方法是取相关参数相对于先验或后验的平均值。例如,对于Beta prior,我们得到:

pdf 被归一化——的意思是,如果我们把p0从0积分到1,我们会得到一个:

因为以下关系:

就我们而言,最重要的信息是B从0归一化到1,这对于像p0这样的概率是必要的。

假设和信息可以通过设置超参数来体现——超参数00和11影响pdf的形状,使得先验信息的编码更加灵活。

例如,使用 0=1和 1=1不能反映p0的首选值。这个pdf看起来像。

另一个先验可以指定0=5,1=5,这更接近p0=1/2附近的值。

最后我们可以用01得到非对称先验,可以看到0=2,1=8。

设置超参数需要记住的一些事情:

如果0=1,则先验将是对称的,先验平均值等于Eprior[p0]=1/2。

如果01,则先验是不对称的,先验平均值与1/21/2不同。

先验强度与0 1之和有关。比较数据中与n0 n1之和,将视为假数。和的相对大小控制先验和似然对后验形状的影响。这将在下面的Python示例中变得清晰。

累积分布函数 (cdf)贝塔累积分布函数 (cdf)要求我们计算p0小于或等于值x的概率。具体来说,cdf定义为:

这个积分也叫不完全贝塔积分,表示为Ix(0,1)。

如果我们想知道x1和xh之间p0的概率,可以用cdf来计算。

不完全Beta积分或cdf及其逆积分允许根据先验或后验计算置信区间。使用这些工具,可以说p0的值在一定范围内有95%的概率。同样,我们将在下面使用Python代码绘制它。

贝塔分布是这个问题的共轭先验--这意味着后验将具有与先验相同的数学形式(它也是一个贝塔分布),并更新了超参数。这种数学上的 "共鸣 "真的很好,让我们不用MCMC就能做完整的贝叶斯推断。

现在来说说贝叶斯定理和这个问题的后验pdf。

贝叶斯定理和后验

我们的最终目标是后验概率密度函数,它结合了似然性和先验性,并反映了我们在考虑数据后对p0的认识。后面pdf的形式是(在这种情况下)。

换句话说,这是给定数据序列D和先验假设p0的概率密度,由具有超参数(0,1)的Beta pdf反映。

在这种情况下,贝叶斯定理采用以下形式:

其中后验P(p0|D,0,1)为蓝色,似然P(D|p0)为黑色,前验P(p0| 0,1)为红色。注意归一化边际似然。

然(上述等式中的分母)现在是一个积分。

尝试将贝叶斯定理视为关于 p0 从假设(α0,α1) 更新到假设 + 数据(D,α0,α1) 的信息:

试着把贝叶斯定理看作是关于p0的信息被从假设(α0,α1)更新为假设+数据(D,α0,α1)。

为了得到后验pdf,我们必须在贝叶斯定理的分母上做积分。在这种情况下,利用贝塔分布的特性,就可以进行计算。该积分如下。

最后一行的积分定义了一个贝塔函数,在关于先验的一节中讨论过,并且有一个已知的结果。

这意味着分母,也叫边际似然,等于。

同样,我们得到这个结果是因为Beta分布是我们所考虑的伯努利过程概率的共轭先验。请注意,来自先验的超参数已经被计数数据所更新。

这与人们预期的完全一样,不需要做所有的数学计算。在任何情况下,在用Python实现这一点之前,有几个注意事项。

  • 后验pdf在0到1的区间内被归一化,就像我们推断p0这样的概率时需要的那样。
  • 后验平均数,是对我们的推断给出一个点估计的方法是
  • 后验的cdf和先验的一样,因为我们仍然有一个Beta分布--只不过,现在的参数是用数据更新的。在任何情况下,我们都可以用不完整的Beta积分和它的逆向找到置信区间,如上所述。

Python 中的推理代码

首先,我们导入一些包,使用这些包来计算和绘制先验、似然和后验。此外,使用 matplotlib,在本例中为 ggplot,创建漂亮的图。

概率

  1. def _int(sef, daa):
  2. ""二进制数据的概率。""
  3. elfus = {s:0 for s in ['0', '1']}
  4. def proes_data(sef, ata):
  5. ""处理数据。""
  6. for s in ['0', '1']:
  7. unts[s] =cont(s)
  8. ""处理概率。""
  9. n0 = couts['0']
  10. n1 = couts['1']
  11. if p0 != 0 and p0 != 1:
  12. # 典型情况
  13. lgpdaa = n0*log(p0) + \
  14. n1*log(1.-p0)
  15. rdta = exp(lgpata)
  16. elif p0 == 0 and n0 != 0:
  17. # 如果n0不是0,p0就不可能是0
  18. lpr_dta = -np.inf
  19. p_dta = exp(lgrata)
  20. elif p0 == 0 and n0 == 0:
  21. # 数据与p0=0一致
  22. lgpr_at = n1*np.log(1.-p0)
  23. p_ata =.exp(lo_dta)
  24. elif p0 == 1 and n1 != 0:
  25. # 如果n1不是0,p0就不可能是1
  26. lpdta = -inf
  27. praa = exp(lor_ta)
  28. elif p0 == 1 and n1 == 0:
  29. # 数据与p0=1一致
  30. log_dta = n0*log(p0)
  31. def prob(sef, p0):
  32. ""获取数据的概率。"""
  33. prdat,_ = ._procs_proabiti(p0)
  34. def logprob(sef, p0):
  35. ""获取数据的概率对数。"""
  36. _, lgpr_a = sel_presplies(p0)

先验分布

我们的先验类基本上是一个围绕 scipy的包,有一个绘图方法。注意 plot() 方法得到了 Beta 分布的平均值,并使用 interval() 方法得到了一个概率为 95% 的区域--这是使用不完整的 Beta 积分和上面讨论的它的逆值完成的。

  1. def _int_(sef, alpa0=1, alph1=1):
  2. ""二进制数据的β先验。""
  3. elfa0 = alha0
  4. sl.1 = alha1
  5. slf.0r = ba(self.0, sef.a1)
  6. def intrval(slf, pb):
  7. ""包含`prob'的pdf区域的端点。
  8. 例如:interval(0.95)
  9. """
  10. return sef.pvitervl(rob)
  11. def mean(self):
  12. """返回先验平均数。"""
  13. def pdf(self, p0):
  14. """p0处的概率密度。"""
  15. return self.p.pdf(p0)
  16. def plot(self):
  17. ""显示平均值和95%置信区间的图。""
  18. fig, ax = tsuplots(1, 1)
  19. x = np.rae(0., 1., 0.01)
  20. # 获得先验平均数 p0
  21. mean = mean()
  22. # 获得包含95%概率的低/高点
  23. low_p0, high_p0 = l.nterval(.95)
  24. xo =nang(_0, hih_p0, 0.01)
  25. # 绘制pdf
  26. ax.plot(x, self.pdf(x), 'r-')
  27. # 填充95%的区域
  28. between(x_prob 0, sel.pdf(x_pob)
  29. # 平均值
  30. ax.stem([mean], [sf.df(mea)

让我们使用新代码绘制一些具有一序列参数的 Beta pdf。

统一先验

带点的垂直线显示 pdf 均值的位置。阴影区域表示对于给定的 α0 和 α1 值,概率为 95% 的(对称)区域。如果您想要平均值和置信区间的实际值,也可以获取这些值:

print("先验均值: {}".format(pri.mean()))

上面的其他先前示例也有效:

  1. prior(5, 5)
  2. plot()

  1. por(2, 8)
  2. iplot()

了解超参数所反映的先前假设的均值和不确定性很有用。

后验

最后,我们为后验构建类。正如您所料,我将数据和先验作为参数,并从这些元素中提取后验所需的参数。

  1. def __int_(sf datprior):
  2. ""后验。
  3. data: 一个数据样本的列表
  4. 先验:β先验类的一个实例
  5. """
  6. elflilihod = liliod(dta)
  7. sefprir = rio
  8. self._css_steror()
  9. def _pces_posteror(slf):
  10. ""使用传递的数据和先验来处理后验。""
  11. # 从似然和先验中提取n0, n1, a0, a1
  12. seln = slfliklihod.counts['0']
  13. sel.n1 = elf.lkelihodcnts['1']
  14. lfa0 = sf.prir.0
  15. self.a = sef.priora
  16. el0rv= beta(selfa0 + sfn0,
  17. sef.a1 + slf.1)
  18. def interalself, prob):
  19. ""含`prob`的pdf区域的端点。
  20. 例如:interval(0.95)
  21. """
  22. def mean(sef):
  23. """返回后验平均数。"""
  24. def pdf(sef, p0):
  25. """p0处的概率密度。"""
  26. def plot(slf):
  27. ""显示先验、似然和后验的图。""
  28. ## 先验
  29. # 得到先验平均数 p0
  30. pri_mean =eorman()
  31. #得到包含95%概率的低/高分值
  32. plo_p0,= interval(0.95)
  33. prob = arange(low_p0, i_hgh_0, 0.01)
  34. # 绘制pdf
  35. plot(prior.pdf(x)
  36. # 填充95%的区域
  37. x.ll_between(pri_p )
  38. # 平均值
  39. astm([pri_mean])
  40. ## 似然
  41. # 绘制似然图
  42. li = [sel.likliood.pro]
  43. # ##后验
  44. #获得后验平均数p0
  45. ostmen = mean()
  46. #得到包含95%概率的低/高点
  47. ow_p0, _high_p0 = interval(0.95)
  48. prob = np.rngest_low_p0po_highp0 0.01)
  49. # 绘制pdf
  50. plot(x, slf.pd(x)
  51. # 填充95%的区域
  52. fil_etween(pos_xob, 0,self.df(pt_pr )
  53. # 平均值
  54. ax2].t_mean])

基本代码就是这样,让我们??做一些例子。

例子

让我们从数据和统一先验的示例开始。

  1. # 数据
  2. data1 = [0,0,0,0,1,1,0,0,0,1]
  3. # 先验
  4. pro1 = prir(1, 1)
  5. # 后验
  6. ot1 = psteior(daa1, ior1)
  7. plot()

这里需要注意的事项:

  • 先验是统一的。这意味着概率和后验具有相同的形状。
  • 95%的置信区间同时显示在先验和后验中。

接下来,让我们考虑具有不统一先验的相同数据。数据集长度为 10,因此 n0+n1=10。让我们用 α0+α1=10 ,设置先验,但先验在与似然不同的位置达到峰值(也许有专家说这应该是先验设置):

  1. # 先验
  2. prir(4, 6)
  3. # 后验
  4. ps2 = postior(da1, pio2)
  5. plot()

显然数据和专家在这一点上存在分歧。然而,因为先验的权重设置为 10 并且数据序列的长度为 10,所以后验峰值位于先验峰值和似然峰值的中间。尝试使用这种效果来更好地理解先验超参数、数据集长度和结果后验之间的相互作用。

作为最后一个例子,我们考虑最后一个例子的两个变体,首先我们使用统一先验:

  1. # 设定概率为0
  2. p0 = 0.2
  3. #设置rng种子为2
  4. n.rand.sed(2)
  5. # 产生数据
  6. dta2 =rando.i([0,1], 500, p=[p0, 1.-p0])
  7. # 先验
  8. prior(1,1)
  9. # 后验
  10. poteir(daa2, pio3)

请注意,概率和后验峰值在同一个地方,正如我们所期望的那样。但是,由于数据集较长(500 个值),峰值要强得多。

最后,我们在同一数据集上使用“错误先验”。在这种情况下,我们将保持先验强度为 10,即 α0+α1=10:

  1. # 先验
  2. prior(6,4)
  3. # 后验
  4. poseor(data, pior4)

请注意,尽管先验在错误的位置达到峰值,但概率和后验非常相似。这个例子表明,如果先验没有设置得太强,合理数量的数据应该产生不错的推理。一般来说,最好让 n0+n1α0+α1 并考虑先验和后验的形状。


最受欢迎的见解

1.matlab使用贝叶斯优化的深度学习

2.matlab贝叶斯隐马尔可夫hmm模型实现

3.R语言Gibbs抽样的贝叶斯简单线性回归仿真

4.R语言中的block Gibbs吉布斯采样贝叶斯多元线性回归

5.R语言中的Stan概率编程MCMC采样的贝叶斯模型

6.Python用PyMC3实现贝叶斯线性回归模型

7.R语言使用贝叶斯 层次模型进行空间数据分析

8.R语言随机搜索变量选择SSVS估计贝叶斯向量自回归(BVAR)模型

9.matlab贝叶斯隐马尔可夫hmm模型实现

▍关注我们
【大数据部落】第三方数据服务提供商,提供全面的统计分析与数据挖掘咨询服务,为客户定制个性化的数据解决方案与行业报告等。
▍咨询链接:http://y0.cn/teradat
▍联系邮箱:3025393450@qq.com

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/52958.html

(0)

相关推荐

  • Hive常用查询命令和使用方法

    技术Hive常用查询命令和使用方法这期内容当中小编将会给大家带来有关Hive常用查询命令和使用方法,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1. 将日志文件传到HDFS ```ba

    攻略 2021年11月11日
  • MySQL如何进行密码管理

    技术MySQL如何进行密码管理这篇文章主要介绍了MySQL如何进行密码管理,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. mysql安装后默认没有密码

    攻略 2021年11月2日
  • Java(10)File递归字节流

    技术Java(10)File递归字节流 Java(10)_File递归字节流1.File类
    1.1File类概述和构造方法【应用】File类介绍它是文件和目录路径名的抽象表示
    文件和目录是可以通过Fil

    礼包 2021年12月14日
  • k8s之PV、PVC

    技术k8s之PV、PVC k8s之PV、PVC目录一、PVC和PV1.1 PV概念1.2 PVC概念1.3 PV与PVC之间的关系1.4 两种PV的提供方式二、基于nfs创建静态PV资源和PVC资源2.

    礼包 2021年11月11日
  • 什么是c语言共用体

    技术什么是c语言共用体本篇内容介绍了“什么是c语言共用体”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、共用体是一种特

    攻略 2021年10月28日
  • oracle启用审计日志(添加审计策略oracle)

    技术oracle中添加审计策略的示例代码小编给大家分享一下oracle中添加审计策略的示例代码,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!s

    攻略 2021年12月17日