本节书摘来自异步社区《贝叶斯思维:统计建模的Python学习法》一书中的第2章,第2.3节,作者【美】Allen B. Downey,更多章节内容可以访问云栖社区“异步社区”公众号查看
2.3 贝叶斯框架
在继续讨论其他的问题前,我想在上一节的基础上重写代码以使其更通用。首先我将定义一个类来封装与此相关的代码 :
class Cookie(Pmf):
def __init__(self,hypos):
Pmf.__init__(self)
for hypo in hypos:
self.Set(hypo,1)
self.Normalize()
Cookie对象是一个映射假设到概率的Pmf对象。__init__方法给每个假设赋予相同的先验概率。如上一节中就有两种假设:
hypos= ['Bowl1','Bowl2']
pmf =Cookie(hypos)
Cookie类提供了Update方法,它以data为参数并修正相应的概率:
def Update (self,data):
for hypo in self.Values():
like= self.Likelihood(data,hypo)
self.Mult(hypo,like)
self.Normalize()
Update遍历suite中的每个假设,并将其概率乘以数据在某一假设下的似然度,似然度由Likelihood计算:
mixes = {
'Bowl 1':dict(vanilla=0.75, chocolate=0.25),
'Bowl 2':dict(vanilla=0.5, chocolate=0.5),
}
def Likelihood(self, data, hypo):
mix = self.mixes[hypo]
like = mix[data]
return like
Likelihood使用mixes,它使用Python的字典结构来映射碗名和在碗中曲奇饼的混合比例。
如下面这样进行更新:
pmf.Update('vanilla')
然后我们就可以打印输出每个假设的后验概率:
for hypo , prob in pmf.Items():
print hypo,prob
其结果是
Bowl 1 0.6
Bowl 2 0.4
结果和我们之前得到的结论一样。比起我们在前面章节看到的,这段代码更复杂。
一个优点是,它可以推广到从同一个碗取不只一个曲奇饼(带替换)的情形:
dateset= ['vanilla', 'chocolate', 'vanilla']
for data in dataset:
pmf.Update(data)
另一优点是,它提供了解决许多类似问题的框架。在下一节中,我们将解决蒙蒂大厅问题的计算,然后看看框架的哪些部分相同。
本节中的代码可以从http://thinkbayes.com/cookie2.py获得。欲了解更多信息,请参见前言的“代码指南”。