火车头问题
铁路上以1到N命名火车头。有一天你看到一个标号60的火车头,请估计铁路上有多少火车头?
应用贝叶斯进行推理,可以将这个问题分成两步:
1. 在得到数据之前,我们对N的认识是什么?
2. 已知一个N的任意值后,得到数据(“标志为60号的火车头”)的似然度?
第一个问题的答案就是问题的前置概率,第二个问题是似然度。
在选择前置概率上,我们还没有太多的基本信息,先假设N可以是从1到1000等概率的任何值。
hypos = xrange(1, 1001)
接着需要的是似然函数。先假设存在一个有N个火车头的车队,我们看到60号火车头的概率是多少?假设只有一个列车运营公司,看到任一个火车头有同等可能,那么看到任何特定火车头的机会为1/N。似然度函数如下:
import logging
#定义字典对象
class _DictWrapper(object):
#具体代码见《贝叶斯思维(实例1)》
def InitSequence(self, values):
for value in values:
self.Set(value, 1)
def __len__(self):
return len(self.d)
#概率质量函数对象
class Pmf(_DictWrapper):
#具体代码见《贝叶斯思维(实例1)》
def Probability(o):
return o / (o + 1)
class Suite(Pmf):
def Update(self, data):
for hypo in self.Values():
like = self.Likelihood(data, hypo)