1、蒙特卡洛方法概述
蒙特卡羅原來是一個賭場的名稱,用它作為名字大概是因為蒙特卡羅方法是一種隨機模擬的方法,這很像賭博場里面的扔骰子的過程。最早的蒙特卡羅方法都是為了求解一些不太好求解的求和或者積分問題。比如積分:
$\int_a^b f(x)\, dx$
如果此時f(x)很難求出其原函數時,那么這個積分就非常難求。當然我們可以通過蒙特卡洛方法來模擬求解近似值,假設我們的函數f(x)如下圖所示
則一個簡單的近似求解方法是在[a,b]之間隨機的采樣一個點。比如x0,然后用f(x0)代表在[a,b]區間上所有的f(x)的值。
那么上面的定積分的近似求解為:
(b−a)f(x0)
然而上面的式子太過於簡單,近似出來的誤差較大,我們將其分成n等分,則近似解可以表示為
[(b−a)/n] [f(x0) + f(x1) + ... + f(xn-1)]
然而上面改進的式子是在假設x在[a,b]之間是均勻分布的前提下的,而絕大部分情況,都是非均勻分布的,甚至有的是離散的值,
因此提出了蒙特卡洛積分法:
則近似解可以表示為
2、概率分布采樣
上一節我們講到蒙特卡羅方法的關鍵是得到x的概率分布。如果求出了x的概率分布,我們可以基於概率分布去采樣基於這個概率分布的n個x的樣本集,代入蒙特卡洛近似求解式子中。
但是還有一個關鍵的問題需要解決,即如何基於概率分布去采樣基於這個概率分布的n個x的樣本集。
對於常見的均勻分布uniform(0,1)是非常容易采樣樣本的,一般通過線性同余發生器可以很方便的生成(0,1)之間的偽隨機數樣本。
而其他常見的概率分布,無論是離散的分布還是連續的分布,它們的樣本都可以通過uniform(0,1)的樣本轉換而得。
比如二維正態分布的樣本(Z1,Z2)可以通過通過獨立采樣得到的uniform(0,1)樣本對(U1,U2)通過如下的式子轉換而得:
除了正態分布之外,還有很多其他常見的連續分布也可以用均勻0-1分布來表示,不過很多時候我們的分布並不是常見的分布,這也就以為着無法通過這些轉換來獲得樣本集的概率分布。
3、接受-拒絕采樣
對於概率分布不是常見的分布,一個可行的辦法是采用接受-拒絕采樣來得到該分布的樣本。
既然 p(x) 太復雜在程序中沒法直接采樣,那么我設定一個程序可采樣的分布 q(x) 比如高斯分布,
然后按照一定的方法拒絕某些樣本,以達到接近 p(x) 分布的目的,其中q(x)叫做 proposal distribution。
具體操作如下,設定一個方便抽樣的函數 q(x),以及一個常量 k,使得 p(x) 總在 kq(x) 的下方。(參考上圖)
1)x 軸方向:從 q(x) 分布抽樣得到 a。
2)y 軸方向:從均勻分布(0,kq(a)) 中抽樣得到 u。
3)如果剛好落到灰色區域: u > p(a),拒絕, 否則接受這次抽樣。
4)重復以上過程。
4、小結
使用接受-拒絕采樣,我們可以解決一些概率分布不是常見的分布的時候,得到其采樣集並用蒙特卡羅方法求和的目的。但是接受-拒絕采樣也只能部分滿足我們的需求,在很多時候我們還是很難得到我們的概率分布的樣本集。比如:
1)對於一些二維分布p(x,y),有時候我們只能得到條件分布p(x|y)和p(y|x)和,卻很難得到二維分布p(x,y)一般形式,這時我們無法用接受-拒絕采樣得到其樣本集。
2)對於一些高維的復雜非常見分布p(x1,x2,...,xn),我們要找到一個合適的q(x)和k非常困難。