計算機可以使用一種隨機算法來計算圓周率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/
使用狄利克雷和貝塔分布作為先驗,有很多參數可調,懶得來回調了,使用產生式模型相當於對數據集合加入了先驗知識,當這種先驗知識符合數據分布的時候,會對實驗結果起到正的作用,當先驗知識不符合實際情況時,可能會起到反的作用。









