本节书摘来自异步社区《贝叶斯思维:统计建模的Python学习法》一书中的第2章,第2.3节,作者【美】Allen B. Downey,更多章节内容可以访问云栖社区“异步社区”公众号查看
在继续讨论其他的问题前,我想在上一节的基础上重写代码以使其更通用。首先我将定义一个类来封装与此相关的代码 :
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 likeLikelihood使用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获得。欲了解更多信息,请参见前言的“代码指南”。
相关资源:贝叶斯思维:统计建模的Python学习法