本节书摘来异步社区《贝叶斯思维:统计建模的Python学习法》一书中的第2章,第2.4节,作者:【美】Allen B. Downey,更多章节内容可以访问云栖社区“异步社区”公众号查看
2.4 Monty Hall难题
为了解决蒙蒂大厅(Monty Hall)问题,我将定义一个新的类:
class monty(Pmf):
def __init__(self,hypos):
Pmf.__init__(self)
for hypo in hypos:
self.Set(hypo,1)
self.Normalize()```
到目前为止,蒙蒂大厅和曲奇饼是完全一样的。创建Pmf的代码也一样,除了假设的名称:
hypos='ABC'
pmf =Monty(hypos)```
对Update的调用几乎是相同的:
data='B'
pmf.Update(data)```
Update的实现也是完全一样的:
def Update (self,data):
for hypo in self.Values ():
like = self.Likelihood(data,hypo)
self.Mult(hypo,like)
self.Normalize()```
唯一需要些额外工作的是Likelihood:
def Likelihood (self,data,hypo):
if hypo==data:
return 0
elif hypo=='A':
return 0.5
else:
return 1```
最后,打印输出的结果是一样的:
for hypo,prob in pmf.Items():
print hypo,prob```
答案是
A 0.333333333333
B 0.0
Ç 0.666666666667
在本例中,Likelihood的编写有一点点复杂,但该贝叶斯框架的Update很简单。