计算机可以使用一种随机算法来计算圆周率PI,方法是在边长为d正方形的范围内不断地产生随机数,正方形内切一个直径为d的圆,设C为落入这个圆内点的个数,S为正方形内所有点的个数,则:
这就是蒙特卡洛法,每次产生的随机数就是一次Sampling。
2、为什么需要sampling
设进行了10次抛硬币实验,结果是HHHHTTTT(H代表正面,T代表反面),已知硬币正反面是不均匀的,要求估计下一次抛硬币的结果。
使用最大似然法进行估计:
第一步使用最大似然的原则估计出出现正面的概率:
然后用这个用最大似然估计出来PI的去预测下次出现正反面的结果。
使用最大后验概率原则进行估计:
前面两种方法都是一种通过最大似然、最大后验概率计算出一个确定的,然后使用它作为判断下一次结果的依据。如果考虑PI不是一个确定的数,而是一个分布的情况:
通过对PI积分,考虑的不是一个确定的数,而是一个分布,但是如何算这个积分呢?之前提到的计算圆周率的例子在数学上算法就是积分法,可以通过积分计算出圆的面积,进而得到圆周率,而通过sampling的方法可以计算这个PI,这样可以避免复杂的积分运算。同样在这里也可以使用sampling的方法去掉这个积分运算:
通过计算上式就可以避免计算积分。现在需要只是按照一定规则选取:
做马尔科夫假设,即转移概率只依赖于前一个状态:
这就是蒙特卡洛马尔科夫法。
Gibbs sampling是蒙特卡洛马尔科夫法的一个特例,即每次抽样的时候都把最新的结果考虑进去,而不是同步更新
介个就是Gibbs sampling了!
3、sampling实战
最后我基于Gibbs抽样的方法实现了一个Naive Bayes分类器,并用最大似然进行参数估计的Naive Bayes分类器进行了对比:
Gibbs 84.1%
实现的代码地址:http://code.google.com/p/naive-bayes-gibbs-sampling/
使用狄利克雷和贝塔分布作为先验,有很多参数可调,懒得来回调了,使用产生式模型相当于对数据集合加入了先验知识,当这种先验知识符合数据分布的时候,会对实验结果起到正的作用,当先验知识不符合实际情况时,可能会起到反的作用。