上一次我們談到,使用蒙特卡洛積分法求積分涉及到兩個問題:1.如何對一個任意分布函數進行抽樣; 2.如何減少方差。這里我們先來探討第一個問題,給定一個概率密度函數,如何對其進行采樣,使采樣滿足其概率分布。
平常有兩種方法實現:
1.逆變換算法
假設我們有一個概率分布函數p(x),對它取積分,可以得到它累積分布函數P(x),這個函數根據性質我們知道它的值域是一定分布在[0,1]區間的。那么通過它的反函數就可以實現輸入[0,1]之間的隨機數,得到符合概率密度分布的采樣點。
我們可以從一個離散分布的圖像中來加深理解,下圖是一個離散分布函數p(x):
它的累積分布函數如下:
可以看到,當我們取值域上的一點ξ,它對應的定義域值為3。p(3)的值較大,因此它也就有更多幾率被采樣到。也就是說對於,輸入一個均勻采樣的[0,1]值,就可以得到符合p(x)概率分布的定義域采樣點。
因此逆變換算法的過程如下:
1.首先計算p(x)的累積分布函數
2.計算累積分布函數的反函數
3.然后在[0,1]均勻分布隨機產生一個隨機數ξ
4.最后將ξ帶入中求出滿足p(x)分布的隨機數。
2.取舍算法
當累計分布函數或其反函數沒有顯示的解析表達式,或者概率密度函數沒有邊界,不能歸一化的時候,逆變換算法就無法使用,此時應當使用取舍算法。
取舍算法的思路非常簡單,假設一個任意函數f(x)被限定在[a,b]區間,在此區間外的所有值均為0,我們想對它進行采樣。我們有一個概率分布函數p(x)使得cp(x)>f(x),那么取舍法的過程如下:
1.產生一個均勻分布在[a,b]的隨機數x
2.產生一個均勻分布在[0,cp(x)]上的隨機數y
3.若y<f(x),則接受這個采樣,否則繼續產生新的隨機數
下圖是f(x)和p(x)的示意圖。其實這個方法就是要判斷生成的隨機數是否在f(x)的范圍以內。