《贝叶斯思维:统计建模的Python学习法》——2.3 贝叶斯框架

本节书摘来异步社区《贝叶斯思维:统计建模的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)```

另一优点是,它提供了解决许多类似问题的框架。在下一节中,我们将解决蒙蒂大厅问题的计算,然后看看框架的哪些部分相同。

上一篇:实现两个INPUT同步输入


下一篇:js002-getElementsByName,getElementById