隨機模擬與採樣方法

隨機模擬方法簡介

隨機模擬方法又稱爲蒙特卡羅方法(Monte Carlo Method)。蒙特卡洛模擬方法的原理是當問題或對象本身具有概率特徵時,可以用計算機模擬的方法產生抽樣結果,根據抽樣計算統計量或者參數的值;隨着模擬次數的增多,可以通過對各次統計量或參數的估計值求平均的方法得到穩定結論。由於涉及到時間序列的反覆生成,蒙特卡洛模擬法是以高容量和高速度的計算機爲前提條件的,因此只是在近些年纔得到廣泛推廣。
從上面的描述我們不難看出隨機模擬方法主要是針對那些確定算法不好解或者解不出來的情況。因此是一種典型的尋求近似解的方法

基本思路

  1. 針對實際問題建立一個簡單易行的概率統計模型,使問題所求的解爲該模型的概率分佈或者數字特徵,比如:某個事件的概率或者是某個隨機變量的期望值。

  2. 對模型中的隨機變量建立抽樣方法,在計算機上進行模擬試驗,得到足夠的隨機抽樣,並對相關事件進行統計

  3. 對試驗結果進行分析,給出所求解的估計及其精度(方差)的估計

蒙特卡羅方法在數學中的應用

參考維基百科

通常蒙特卡洛方法通過構造匹配一定規則的隨機數來解決數學上的各種問題。對於那些由於計算過於複雜而難以得到解析解或者根本沒有解析解的問題,蒙特卡洛方法是一種有效的求出數值解的方法。一般蒙特卡洛方法在數學中最常見的應用就是蒙特卡洛積分。下面是蒙特卡羅方法的兩個簡單應用:

圓周率

蒙特卡洛方法可用於近似計算圓周率:讓計算機每次隨機生成兩個0到1之間的數,看以這兩個實數爲橫縱座標的點是否在單位圓內。生成一系列隨機點,統計單位圓內的點數與總點數,(圓面積和正方形面積之比爲PI:4,PI爲圓周率),當隨機點獲取越多時,其結果越接近於圓周率(然而準確度仍有爭議:即使取10的9次方個隨機點時,其結果也僅在前4位與圓周率吻合)。用蒙特卡洛方法近似計算圓周率的先天不足是:第一,計算機產生的隨機數是受到存儲格式的限制的,是離散的,並不能產生連續的任意實數;上述做法將平面分區成一個個網格,在空間也不是連續的,由此計算出來的面積當然與圓或多或少有差距。

蒙特卡羅積分

舉個簡單的例子,假設我們要求f(x)的積分baf(x)dx
但是f(x)的形式比較複雜不好求積分,使用蒙特卡羅積分方法轉化爲baf(x)q(x)q(x)dx
把q(x)看作是x在區間[a,b]內的概率分佈,前面的分數部分看做一個函數,然後再q(x)下抽取n個樣本,當n足夠大時,可以利用均值來近似(大數定理),1nif(xi)p(xi)
因此只要q(x)比較容易採樣就行。

隨機模擬三個要素:隨機數,邏輯模型,反覆試驗。其基本思路就是要把待解決的問題轉化爲一種可以通過某種採樣方法可以解決的問題,因此隨機模擬方法的核心就是如何對一個概率分佈得到樣本,即抽樣(sampling)。

常見的採樣方法

直接採樣

通過對均勻分佈採樣,實現對任意分佈採樣。

一般而言均勻分佈 Uniform(0,1)的樣本是相對容易生成的。 通過線性同餘發生器可以生成僞隨機數,我們用確定性算法生成[0,1]之間的僞隨機數序列後,這些序列的各種統計指標和均勻分佈 Uniform(0,1) 的理論計算結果非常接近。這樣的僞隨機序列就有比較好的統計性質,可以被當成真實的隨機數使用。

而我們常見的概率分佈,無論是連續的還是離散的帆布,都可以基於Uniform(0,1)的樣本生成。

直接採樣步驟:

  1. 從Uniform(0,1)隨機產生一個樣本z
  2. 另z=h(y),其中h(y)爲y的累積概率分佈CDF
  3. 計算y=h1(z)
  4. 結果y爲對p(y)的採樣

注:需要知道累積概率分佈的解析表達式,且累積概率分佈函數存在反函數
但是如果h(x)不能確定或者沒有無法解析求逆則直接抽樣不再合適。對於複雜的現實模型其實是不常用的。

接受-拒接採樣

簡稱拒絕採樣,基本思想:假設我們需要對一個分佈f(x)進行採樣,但是卻很難直接進行採樣,所以我們想通過另外一個容易採樣的分佈g(x)的樣本,用某種機制去除掉一些樣本,從而使得剩下的樣本就是來自與所求分佈f(x)的樣本。

  1. 給定目標分佈密度π(x)
  2. 建議密度(proposal density)q(x)和常數M,使得
    對q(x)採樣比較容易
    q(x)的形狀比較接近π(x)
    對任意x,有π(x)Mq(x)
  3. 通過對q(x)採樣實現對π(x) 採樣
    這裏寫圖片描述
    採樣過程:
    產生樣本Xq(x)UUniform[0,1]
    Uπ(X)/Mq(x)X ,接受的樣本服從分佈π(x)
    等價於:
    Y=Mq(X)UYπ(X) ,則接受X

在高維空間,接受-拒絕採樣會出現兩個問題,一是合適的proposal density q(x)比較難找,而是很難確定一個準確的M值。這兩個問題會導致拒絕率很高,無用計算增加。

重要性採樣

通過從已知採樣的概率q(x)採樣,近似積分
I=f(x)π(x)dx=f(x)π(x)q(x)q(x)dx
從q(x)中抽取N個樣本,上述式子就約等於1NNif(xi)π(xi)q(xi) 。這相當於給每一個樣本賦予了一個權重w(xi)=π(xi)q(xi) ,q(x)大意味着概率大,那麼N裏面含有這個樣本的xi 就多,即這些樣本的權重大,所以稱之爲重要性抽樣。下面這個鏈接裏關於重要性採樣的理解寫的很形象:
http://blog.sina.com.cn/s/blog_4e5740460100cw5b.html
採樣過程:

  1. 選擇一個容易抽樣的分佈q(x),產生N個樣本X1,...,XNq(x)
  2. 近似解:1NNif(xi)π(xi)q(xi)

注:q(x)的形狀應與f(x)π(x) 的形狀足夠近似,且q(x)的尾部比π(x) 的尾部厚,估計的方差纔不爲無限大。

在高維空間中合適的q(x)很難找到。

MCMC採樣方法

重要性採樣和接受-拒絕採樣都在q(x)與π(x) 很相似的時候才表現好。而且在高維空間問題中,標準的採樣方法會失敗:

  1. 接受-拒絕採樣:維數增高,拒絕率 100%
  2. 重要性採樣:大多數的樣本權重 0

而且上述兩種採樣方法都是獨立採樣的,效率較低,MCMC採樣方法是關聯採樣,即下一個樣本與這個樣本有關係。在蒙特卡洛模擬中,我們在後驗分佈中抽取樣本,當這些樣本獨立時,利用大數定律樣本均值會收斂到期望值。如果得到的樣本是不獨立的,那麼就要藉助於馬爾科夫鏈進行抽樣。MCMC(Markov Chain Monte Carlo)方法就是爲了這個目的而誕生的。

MCMC方法的基本思想是:通過構建一個markov chain使得該markov chain的穩定分佈是我們所要採樣的分佈f(x)。如果這個markov chain達到穩定狀態,那麼來自這個chain的每個樣本都是f(x)的樣本,從而實現抽樣的目的。這裏存在一個核心問題,如何構建滿足要求的markov chain

馬爾科夫鏈基礎

皮姐姐的博客寫過這部分,寫的很清楚了,直接放在這裏吧
http://blog.csdn.net/pipisorry/article/details/46618991
參考文獻【1】中也有講得很詳細。
總之這部分的重點是馬氏鏈的平穩分佈,這是MCMC算法的核心基礎

馬氏鏈的收斂性質主要由轉移矩陣P 決定, 所以基於馬氏鏈做採樣的關鍵問題是如何構造轉移矩陣P,使得平穩分佈恰好是我們要的分佈π(x)
這裏的關鍵是細緻平穩條件(具體內容在上面兩個參考鏈接裏都有)。細緻平穩條件的好處,就是我們能控制馬爾科夫鏈收斂到我們指定的分佈。

構造滿足條件的馬氏鏈

假設我們已經有一個轉移矩陣爲Q 的馬氏鏈,q(i,j) 表示從狀態i到j的概率,通常情況下p(i)q(i,j)p(j)q(j,i) 也就是細緻平穩條件不成立,所以p(x)不太可能是這個馬氏鏈的平穩分佈。因此,我們就要對這個馬氏鏈進行一些小改造,使他滿足細緻平滑條件。例如我們引入一個α(i,j)使
p(i)q(i,j)α(i,j)=p(j)q(j,i)α(j,i)
最簡單的我們按照對稱性取
α(i,j)=p(j)q(j,i),α(j)=p(i)q(i,j)
就可以使得上式成立,可以看做具有新的轉移矩陣Q 的馬氏鏈,其中
Q(i,j)=q(i,j)α(i,j),Q(j,i)=q(j,i)α(j,i) .
因此馬氏鏈Q 滿足細緻平穩條件,且平穩分佈是p(x)。

在改造 Q 的過程中引入的 α(i,j) 稱爲接受率,物理意義可以理解爲在原來的馬氏鏈上,從狀態 i 以q(i,j) 的概率轉跳轉到狀態j 的時候,我們以α(i,j) 的概率接受這個轉移,於是得到新的馬氏鏈Q 的轉移概率爲q(i,j)α(i,j)
注:當按照上面介紹的構造方法把Q–>Q 後,就不能保證Q 是一個轉移矩陣了,即Q 的每一行加和爲1。這時應該在當 j != i 的時候概率Q (i, j) 就如上處理, 當j = i 的時候, Q (i, i) 應該設置Q (i, i) = 1- 其它概率之和,歸一化概率轉移矩陣。

MCMC採樣算法(參考文獻1)

這裏寫圖片描述
上述過程中 p(x),q(x|y) 說的都是離散的情形,事實上即便這兩個分佈是連續的,以上算法仍然是有效,於是就得到更一般的連續概率分佈 p(x)的採樣算法,而 q(x|y) 就是任意一個連續二元概率分佈對應的條件分佈。
以上的 MCMC 採樣算法已經能很漂亮的工作了,不過它有一個小的問題:馬氏鏈Q 在轉移的過程中的接受率α(i,j) 可能偏小,這樣採樣過程中馬氏鏈容易原地踏步,拒絕大量的跳轉,這使得馬氏鏈遍歷所有的狀態空間要花費太長的時間,收斂到平穩分佈p(x)的速度太慢。有沒有辦法提升一些接受率呢?

假設 α(i,j) =0.1,α(j,i) =0.2
, 此時滿足細緻平穩條件,於是
p(i)q(i,j)×0.1=p(j)q(j,i)×0.2

上式兩邊擴大5倍,我們改寫爲
p(i)q(i,j)×0.5=p(j)q(j,i)×1

看,我們提高了接受率,而細緻平穩條件並沒有打破!這啓發我們可以把細緻平穩條件式中的α(i,j) ,α(j,i) 同比例放大,使得兩數中最大的一個放大到1,這樣我們就提高了採樣中的跳轉接受率。所以我們可以取
α(i,j)=min{p(j)q(j,i)p(i)q(i,j),1}

於是,經過對上述MCMC 採樣算法中接受率的微小改造,我們就得到了如下教科書中最常見的 Metropolis-Hastings 算法。

Metropolis-Hasting算法

這裏寫圖片描述
對於分佈p(x),我們構造轉移矩陣Q 使其滿足細緻平穩條件
p(x)Q(xy)=p(y)Q(yx)
此處x並不要求是一維的,對於高維空間的p(X) ,如果滿足細緻平穩條件
p(X)Q(XY)=p(Y)Q(YX)
那麼以上的M-H算法一樣有效

Gibbs Sampling

對於高維的情況,由於接受率α (通常小於1)的存在,M-H算法效率不夠高,能否找到一個轉移矩陣Q使得接受率α=1 呢?
先看二維的情況,假設有一個概率分佈p(x,y),考察x座標相同的兩個點A(x1,y1),B(x1,y2) ,我們發現
p(x1,y1)p(y2|x1)=p(x1)p(y1|x1)p(y2|x1)
p(x1,y2)p(y1|x1)=p(x1)p(y1|x2)p(y1|x1)
所以得到
p(x1,y1)p(y2|x1)=p(x1,y2)p(y1|x1)

p(A)p(y2|x1)=p(B)p(y1|x1)
基於以上等式,我們發現,在x=x1 這條平行於y軸的直線上,如果使用條件分佈p(y|x_1)作爲任何兩個點之間的轉移概率,那麼任何兩個點之間的轉移滿足細緻平穩條件。同樣的,如果我們在y=y1 這條直線上任意取兩個點A,C則有
p(A)p(x2|y1)=p(C)p(x1|y1)
這裏寫圖片描述
於是我們可以如下構造平面上任意兩點之間的概率轉移矩陣Q
這裏寫圖片描述
有了如上的轉移矩陣Q,我們很容易驗證對平面上的任意兩點X,Y,滿足細緻平穩條件
p(X)Q(XY)=p(Y)Q(YX)
於是這個二維空間上的馬氏鏈將收斂到平穩分佈p(x,y)。而這個算法就稱爲 Gibbs Sampling 算法,是 Stuart Geman 和Donald Geman 這兩兄弟於1984年提出來的,之所以叫做Gibbs Sampling 是因爲他們研究了Gibbs random field, 這個算法在現代貝葉斯分析中佔據重要位置。

二維Gibbs Sampling算法

這裏寫圖片描述

Gibbs Sampling算法中的馬氏鏈轉移

以上採樣過程中,如圖所示,馬氏鏈的轉移只是輪換的沿着座標軸 x軸和y軸做轉移,於是得到樣本 (x0,y0),(x0,y1),(x1,y1),(x1,y2),(x2,y2),⋯ 馬氏鏈收斂後,最終得到的樣本就是 p(x,y) 的樣本,而收斂之前的階段稱爲 burn-in period。額外說明一下,我們看到教科書上的 Gibbs Sampling 算法大都是座標軸輪換採樣的,但是這其實是不強制要求的。最一般的情形可以是,在t時刻,可以在x軸和y軸之間隨機的選一個座標軸,然後按條件概率做轉移,馬氏鏈也是一樣收斂的。輪換兩個座標軸只是一種方便的形式。

n 維Gibbs Sampling算法

以上的過程我們很容易推廣到高維的情形,如果x1 變爲多維情形x1 ,可以看出推導過程不變,所以細緻平穩條件同樣是成立的
p(x1,y1)p(y2|x1)=p(x1,y2)p(y1|x1)
此時轉移矩陣Q由條件分佈p(y|x1) 定義。上式知識說明了一根座標軸的情形,二維情形類似。所以n維空間中對於概率分佈p(x1,x2,...,xn) 可以如下定義轉移矩陣

  1. 如果當前狀態爲(x1,x2,...,xn) ,馬氏鏈轉移的過程中,只能沿着座標軸做轉移,沿着xi 這根座標軸轉移時,轉移概率由條件概率p(xi|x1,...,xi1,xi+1,...,xn) 定義
  2. 其它無法沿着單根座標軸進行的跳轉,轉移概率都設置爲 0

Gibbs抽樣就是在這m個條件分佈中迭代產生樣本。於是我們可以把吉布斯採樣由二維推廣到n維:
[圖片]

以上算法收斂後,得到的就是概率分佈p(x1,x2,...,xn) 的樣本,當然這些樣本並不獨立,但是我們此處要求的是採樣得到的樣本符合給定的概率分佈,並不要求獨立。
同樣的,在以上算法中,座標軸輪換採樣不是必須的,可以在座標軸輪換中引入隨機性,這時候轉移矩陣 Q 中任何兩個點的轉移概率中就會包含座標軸選擇的概率,而在通常的 Gibbs Sampling 算法中,座標軸輪換是一個確定性的過程,也就是在給定時刻t,在一根固定的座標軸上轉移的概率是1。

吉布斯採樣可以看做是M-H算法的一個特例,即接受率α=1 的情況。證明如下:
考慮一個M-H採樣的步驟,它涉及到變量zk ,剩餘變量z¬k 保持不變。同時,從z到z 的轉移概率爲qk(z|z)=p(zk|z¬k) 。我們注意到z¬k=z¬k ,因爲再採樣步驟中,向量的各個元素都不變。又p(z)=p(zk|z¬k)p(z¬k) ,因此,確定M-H算法中的接受概率爲
A(z,z)=p(z)qk(z|z)p(z)qk(z|z)=p(zk|z¬k)p(z¬k)p(zk|z¬k)p(zk|z¬k)p(z¬k)p(zk|z¬k) =1

收斂性判斷

當然無論是metropolis-hasting算法還是gibbs算法,都有一個burn in的過程,所謂burn in的過程就是因爲這個兩個算法本身都是markov chain的算法,要達到穩定狀態需要一定的步驟才能達到,所以需要一個burn in過程,只有在達到平衡狀態時候得到的樣本才能是平衡狀態時候的目標分佈的樣本,因此,在burn in過程中產生的樣本都需要被捨棄。如何判斷一個過程是否達到了平衡狀態還沒有一個成熟的方法來解決,目前常見的方法是看是否狀態已經平穩(例如畫一個圖,如果在較長的過程中,變化已經不大,說明很有可能已經平衡)當然這個方法並不能肯定一個狀態是否平衡,你可以舉出反例,但是卻是實際中沒有辦法的辦法。

MCMC方法依賴於產生的馬氏鏈在t足夠大時要收斂。
關於鏈的收斂有這樣一些檢驗方法。
(1)圖形方法 這是簡單直觀的方法。我們可以利用這樣一些圖形:

(a)跡圖(trace plot):將所產生的樣本對迭代次數作圖,生成馬氏鏈的一條樣本路徑。如果當t足夠大時,路徑表現出穩定性沒有明顯的週期和趨勢,就可以認爲是收斂了。
(b)自相關圖(Autocorrelation plot):如果產生的樣本序列自相關程度很高,用跡圖檢驗的效果會比較差。一般自相關隨迭代步長的增加而減小,如果沒有表現出這種現象,說明鏈的收斂性有問題。
(c)遍歷均值圖(ergodic mean plot):MCMC的理論基礎是馬爾科夫鏈的遍歷定理。因此可以用累積均值對迭代步驟作圖,觀察遍歷均值是否收斂。

(2)蒙特卡洛誤差
(3)Gelman-Rubin方法

From:
http://blog.csdn.net/sherrylml/article/details/51434549
Ref:
[1] http://cos.name/2013/01/lda-math-mcmc-and-gibbs-sampling/
[2] http://blog.csdn.net/xianlingmao/article/details/7768833
[3]http://www.cnblogs.com/xbinworl/p/4266146.html?utm_source=tuicool&utm_medium=referral
[4] https://site.douban.com/182577/widget/notes/10567181/note/292072927/
[5]Pattern Recognition and Machine Learning. Chapter11 Sampling Method

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章