python贝叶斯分析,贝叶斯预测模型python
目录
1.介绍
2.问题描述
3.贝叶斯定理
4.贝叶斯引擎:标量实现
5.贝叶斯引擎:矢量化
测试
7.附言
7.1 2021-09-28
1.引言介绍了贝叶斯模型的一个python实现实例,展示了基于标量运算的实现和基于numpy矩阵运算的实现的区别。
2.问题描述这个问题的例子取自参考文献1-第一章。
描述:假设有一台制造灯泡的机器。你想知道机器是工作正常还是出了毛病。为了得到答案,你可以测试每一个灯泡,但是灯泡的数量太多了,在实际生产过程中可能难以承受测试每一个。利用贝叶斯推断,可以根据少量样本(比如采样结果)来估计机器是否正常工作(以概率的方式)。
构建贝叶斯模型时,首先需要两个要素:
(1)预先分配
(2)可能性比率
先验分布是我们对机器工作状态的初始信念。首先我们确定描述机器工作状态的第一个随机变量,记为m,这个随机变量有两种工作状态:{working,broken},缩写为{w,br}(缩写为br以区别于下面Bad的缩写为b)。作为最初的信念,我们相信机器是好的,可以正常工作。先验分布定义如下:
p(M=工作)=0.99
p(M=破损)=0.01
这表明我们对机器的正常运行有高度的信心,有99%的概率正常运行。
第二个随机变量是L,表示机器生产的灯泡的工作状态。灯泡有好坏之分,包含两种状态:{好,坏},下面缩写为{g,b}。注意br和b的区别。
我们需要根据机器的工作状态给出L的先验分布,也就是条件概率P(LM),它代表贝叶斯公式中的似然性。
定义这个似然概率分布(因为M和L各有两个状态,所以总共有四个条件概率)如下:
p(L=好M=w)=0.99
P(L=Bad M=w)=0.01
p(L=良好M=br )=0.6
P(L=Bad M=br )=0.4
以上似然概率表明,机器正常时,我们认为每生产100个灯泡只会有一个坏,而机器异常时,不是所有灯泡都会坏,而是40%坏。为了便于实现,可以写成如下矩阵形式:
现在,我们已经完整地描述了贝叶斯模型,我们可以用它来做一些神奇的估计和预测。
我们的输入是一些灯泡的采样结果。假设我们采样了十个灯泡,采样结果如下:
{坏,好,好,好,好,好,好,好,好,好,好}
我们先来看看我们基于贝叶斯推理得出的关于机器工作状态的信念(后验概率)是如何变化的。
3.贝叶斯定理贝叶斯定理以贝叶斯公式的形式表示如下:
这个问题的具体映射可以表述如下:
贝叶斯模型的优点是可以在线进行,即观测数据可以一个一个来。每接收到一个新的观测数据,计算并更新基于贝叶斯公式的后验概率,更新后的后验概率作为贝叶斯公式下一次应用的先验概率。因此,在线贝叶斯模型的基本处理流程如下:
4.贝叶斯引擎:标量实现
首先,我们为bayes处理编写一个标量运算形式的函数。
Prior以向量的形式存储先验概率分布,prior[0]表示P(M=工作),prior[1]表示P(M=损坏)。
似然以矩阵的形式存储似然概率分布。第一行表示P(L/M=工作),第二行表示P(L/M=损坏)。
在这个例子中,当输入时,证据的公式(注意证据依赖于输入的观察数据)是:
注意我写P(w)的时候其实是P(M=w)的意思,但是实际上是P (m=w)的意思,以此类推。根据上下文,这些不应该导致混淆。
第一个函数的代码如下:
定义贝叶斯标量(先验,似然,数据): 贝叶斯模型示例。参数-先验:浮点型,一维向量先验信息,P(X).似然:浮点二维矩阵似然函数,P(YX).数据:字符串列表。值:好,坏观察数据样本序列返回-后验:浮点P(X,Y),后验序列后验=np.zeros((len(data) 1,2))后验[0,=先前#不用于计算,仅用于以后在列举(数据)中绘制k,L:if L== good :L_value=0 else:L _ value=1 # print(L,L _ value,likelihood[:L_value]) evidence=likelihood[0,L_value] * prior[0] likelihood[1,L_value] * prior[1]LL0 _ prior _ prod=likelihood[0,L _ value]* prior贝叶斯引擎:矢量化我们注意到,证据的计算可以表示成两个向量的点积,如下所示。
这样就非常方便用数组来实现了。本例中每个随机变量只有两种取值,在复杂的情况下,每个随机变量有很多种取值时,有效利用向量或矩阵的运算是简洁的运算实现的必不可缺的要素。以上这两个向量的点积可以用numpy.dot()来实现。
另外,可能性和在前的乘积是分别针对M的两种状态进行计算(注意,我们需要针对M的两种不同状态分别计算后),不是用向量的点积进行计算,而是一种逐元素乘法,可以用numpy.multiply()进行计算。所以在…向量化…版本中贝叶斯更新处理削减为两条语句,与上面的数量版本相比显得非常优雅简洁(好吧,也许这个简单例子中还显不出那么明显的优势,但是随着问题的复杂度的增加,这种优势就会越来越明显了。)
由此我们得到向量化处理的函数如下:
定义贝叶斯向量(先验,似然,数据): 贝叶斯模型示例。参数-先验:浮点型,一维向量先验信息,P(X).似然:浮点二维矩阵似然函数,P(YX).数据:字符串列表。值:好,坏观察数据样本序列返回-后验:浮点P(X,Y),后验序列后验=np.zeros((len(data) 1,2))后验[0,]=先验#不用于计算,只是为了以后在列举(数据)中绘制k,L:如果L==好:L_value=0 else:L _ value=1 # print(L,L _ value,似然[:L_value])evidence=NP。点(似然[:L _值],先验[:])后验[k ^ 1,=np.multiply(似然[:L _ value],先验)/证据先验=1测试让我们来看看利用以上函数对我们的观测数据进行处理,后验概率将会如何变化。
import numpy as NP import matplotlib . py plot as PLT prior=NP . array([0.99,0.01])likelihood=NP . array([[0.99,0.01],[0.6,0.4]])data=[bad , good , good , good , good , good , good , good , good]后验1=bayes_scalar(先验,似然,数据)后验2=bayes_vector(先验,似然,数据)if np.allclose(后验1,后验2):后验)fig,ax=PLT . subplots()ax . plot(posterior 1[:0])ax.plot(posterior1[:1])ax . grid()# fig . sup title( poeter or曲线vs观测数据)ax.set _ title (poster曲线vs观测数据)PLT.show()运行上面的代码可以得到后验概率的变化如下图所示(注意第一点是先验的):
当然,上面的代码也验证了两个版本的贝叶斯函数是完全等价的。
7.附言
你完了。
第一个关于学习贝叶斯统计的程序和第一个关于学习贝叶斯统计的博客。
别人没有,等你想到了什么,再回信。
下一篇文章将在这个例子的基础上做一些进一步的探索。
7.1 2021-09-28
将“贝叶斯推断”改为“贝叶斯模型”。因为经过一些阅读理解,我认为这个例子体现的东西不能说是贝叶斯推理。贝叶斯推断是一种后验概率分布。上面的例子是在每一个新的数据到来时重新计算一个新的后验概率而不是一个后验概率分布,所以这个例子只是贝叶斯基本公式的一个应用例子,不能说是一个严肃的贝叶斯推断(可能还是一个错误的理解,不过没关系。对一个概念的理解是一个循序渐进的过程。这里先记录下此时的当前认识。给未来的自己一个批评过去的自己的机会)
[参考文献1] 《概率图模型:基于R语言》,作者大卫贝洛特,由天真的哑铃翻译。
如何在CSS中设置div滚动条的样式以及如何在HTML div的三面添加边框
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。