1. Monte Carlo 積分
蒙特卡洛方法的思想很簡單,就是用隨機投點法來模擬不規則圖形的面積。
比如在1*1的矩形中,有一個不規則的圖形,我們想要直接計算該圖形的面積很困難,那怎么辦呢?我們可以拿N個點,隨機拋在1*1的矩形框中,數一下落入該不規則圖形中的點的個數count,那么該不規則圖形的面積就可以用count/N近似。
除了求面積,蒙特卡洛方法還有什么應用呢?
求積分。
有函數f(x),它在區間[0, a]的積分就是x=0, x=a以及f(x)和x軸圍成區域的面積,我們將[0, a]划分n份,那么積分可以寫成:

我們采用蒙特卡洛采樣的思想,右邊把極限去掉,只取n個點,那么剩下的部分豈不就是f(x)的均值E[f(x)]?沒錯,就是n個點的f(x)的均值。
所以,對於f(x)在[a, b]的積分,我們可以通過求f(x)的均值來模擬。
舉個小例子,我們求這個積分:

我們隨機取[0,1]上的N個點,然后求其均值就是模擬該積分。
MATLAB代碼
N_samples = 100000; f_N = zeros(N_samples, 1); Z_N = rand(N_samples, 1); for i = 1 : N_samples f_N (i, 1) = atan(Z_N(i, 1)) / (Z_N(i, 1) * Z_N(i, 1) + Z_N(i, 1) * sin(Z_N(i, 1))); end I_cap = mean(f_N)
Z_N保存隨機取的N_samples = 100000個點的x值,f_N保存f(x),然后求f_N的均值,得到的就是積分I。

2. 直接采樣
直接采樣的思想是,通過對均勻分布采樣,實現對任意分布的采樣。因為均勻分布采樣好猜,我們想要的分布采樣不好采,那就采取一定的策略通過簡單采取求復雜采樣。
假設y服從某項分布p(y),其累積分布函數CDF為h(y),有樣本z~Uniform(0,1),我們令 z = h(y),即 y = h(z)^(-1),結果y即為對分布p(y)的采樣。

舉個例子:

直接采樣有一個問題,就是上圖下方的那兩個問號。
3. 接收-拒絕采樣
接受-拒絕采樣的思想是,對於分布p(z),很難通過直接采樣進行采樣,但是我們有q(z),可以通過直接采樣或其他采樣進行采樣,那么我們怎么可以通過q(z)采樣得到p(z)的采樣呢?
先看下圖:

紅色的是p(z), 藍色的是q(z),我們對q(z)乘一個參數k,讓k能正好包住p(z),那么對於每一個從q(z)得到的樣本z0,我們有一定的概率接受它,概率的大小就是p(z0) / kq(z0)。很容易就能看出來,在p(z)和kq(z)相切的地方的采樣,接受率就是1。那么有人問了,接受率能計算出來,但是我們對於一個樣本z0,到底怎么判斷是接受還是不接受啊?我們有u~Uniform[0,1],對於每一個樣本z0,我們一個u0,如果u0 <= p(z0) / kq(z0),我們就接受,否則就拒絕。重復此過程,得到的樣本就服從分布p(z)。

當然,q(z)的選取要有一定規則:q(z)與p(z)外形要相近,q(z)采樣方便。
現在有一個問題,k怎么求?
其實也很簡單,看圖有 kq(z) >= p(z),那么k >= p(z) / q(z),我們求p(z) / q(z)的最大值,即為k。
舉個例子,對截斷正態分布的接受-拒絕采樣。
截斷正態分布的意思就是對於正態分布N(a, b) x屬於[0, 4],其在[0, 4]上的積分為1,而不是在負無窮到正無窮的積分為1。截斷正態分布不是正態分布,所以,我們知道截斷正態分布的概率密度函數。
維基上對截斷正態分布的定義:

分子的小fai是標准正態分布的概率密度函數,分母上的大fai是標准正態分布的累積分布函數。
我們有p(z)服從N(1, 1), I(0 <= x <= 4),令q(z)~U[0, 4],根據上圖的公式,p(z)就有了,q(z) = 1/4,所以k = max(p(z) / q(z)),在z = 1(均值)的時候p(z) / q(z)取最大,所以得到k:

這個例子比較巧,分母沒有z,我們可以直接判斷在z=1時,p(z)/q(z)取最大,如果p(z), q(z)都有z,那么要通過求導的方式求k了。
4. 重要性采樣求均值
對於重要性采樣,我之前是有個疑問的,既然是采樣,為何最后沒有得到樣本,反而去求均值去了?其他很多介紹重要性采樣的文章都沒有講明白這一點,其實重要性采樣與接受-拒絕采樣有異曲同工之妙。接受拒絕采樣時通過接受拒絕的方式對通過q(z)得到的樣本進行篩選使得最后得到的樣本服從分布p(z),每個接受的樣本沒有高低貴賤之分,一視同仁。而重要性采樣的思想是,對於通過q(z)得到的樣本,我全部接受!全部接受的話會有一個問題,那就是最后樣本點分布不能服從p(z)分布,為了矯正這個樣本全部接受帶來的偏差,我們給每個樣本附一個重要性權重,比如,對於p(z0)/q(z0)=1的樣本,給的權重大一點,p(z0)/q(z0)=0.1的樣本,權重小一點。但是這個權重怎么算呢?哎,我們發現這個p(z0)/q(z0)不就是一個很好的權重標識嗎?
重要性采樣取得到的是帶有重要性權重的服從q(z)分布的樣本,這個權重乘以樣本之后的結果其實就是服從p(z)分布的。對於這種比較特殊的樣本,我們怎么用呢?我們一般用來求均值,所以,這一小節的標題是重要性采樣求均值。如果只寫重要性采樣容易讓人產生誤解。

應當注意的是,圖中p(z)與f(z)的關系,p(z)是一種分布,是相對於z軸的采樣點而言的,比如在紅色的兩個駝峰處,z的取點比較多,在其他地方z的取點就比較少,這叫樣本分布服從p(z)。對於f(z)是一種映射關系,將z值映射到其他維度。比如我們熟悉的y = f(x),將x映射到y。我們所說的求均值就是求f(z)的均值。這一點一定要想明白。
5. 馬爾科夫蒙特卡洛采樣 & Gibbs采樣
這兩部分,很多人已經寫了不錯的文章,我就不寫了。
推薦一個博文MCMC(Markov Chain Monte Carlo) and Gibbs Sampling,介紹的已經很清楚了。