MCMC-蒙特卡洛算法

1.馬爾可夫鏈

     有這麼一種鏈,就是當前點的狀態的概率只與前一個點的狀態有關,這就是一階馬爾可夫鏈。多階的就是將與前一個點改成與前k個點。

這裏有一個很經典的列子:

就是將一天的天氣分成三種狀態:出太陽,下雨,陰天。

首先明確點是什麼?點就是某一天,可以設爲x,

然後就是一條鏈了,鏈就是..., 昨天,今天,明天,後天,...

今天的天氣狀態和今天以前的我們都知道的,那麼明天呢?我們現在要做一個天氣預報,預報明天或後天的天氣情況該怎麼辦呢?當然,這可以觀測天象,但是,觀察天象後也還是不能確切的知道什麼情況明天會發生。所以,這裏就有一個概率計算在裏面。現在,假設連續天的天氣情況是一個馬爾可夫鏈,且是一階的,即我們知道今天的情況,那麼明天的情況就會由今天的情況所決定。記鏈爲:x(t+1),t+1表示是第t+1天。

假設,今天的天氣情況爲出太陽。則可以將三種狀態今天的概率表示爲:(1,0,0),即出太陽概率爲1,其它情況爲0.這是因爲我們知道了今天是出太陽的。那麼,明天天氣是什麼情況呢?這就需要知道轉移概率了,所謂轉移概率就是一個條件概率:P(明天出太陽/今天出太陽),P(明天下雨/今天出太陽),P(明天陰天/今天出太陽)。是不是,這就直接的知道了明天各種天氣情況的概率?當我們去推算後天的時候又該怎麼樣呢?明天具體是什麼天氣是不知道的,因此,只能用概率的形式去推算了。這樣可以列舉出下面的遞推公式了:

π(t+1),π(t)是我們每天天氣的狀況,這裏t爲時間,P爲轉移矩陣。對於三種天氣狀況,我們可得到3x3的轉移矩陣,一個例子如下:

這裏是借用了文獻中的源數據:

這樣的話,我們就可以一直的計算下去了,想要哪天的天氣,一計算就可以了。但是在實際中是存在誤差的,就是這個轉移概率矩陣我們不能夠精確的得到,所以,天氣預報不敢報的很遠了。

好了,這裏來理一理這個算法的要素:1.假設一個鏈式馬爾可夫鏈,即要滿足馬爾可夫的性質,當前狀態只和前一狀態有關;2.需要一個已知的轉移概率矩陣。

以上,只是MCMC方法的基礎。但有了這個以後就好辦了。

2.MCMC生成隨機樣本

很多時候,我們都只是在做這樣一件事情:就是我們的樣本羣都已經得到,然後去估計這個樣本羣服從什麼分佈。

那麼,現在如果我們編寫了一個算法,現在要去測試我們所編寫的算法是否正確,那麼我們是需要測試數據了。當我們的算法是去估算一個樣本羣的分佈時,那麼我們應該要去產生某分佈的樣本數據。這個想到該怎麼產生嗎?例如,現在要產生一個服從均勻分佈的樣本羣,數量是在10000以上,如果想靠手動去產生,那是不可能的。所以得給用計算機了,這個要是在MATLAB中我們有現成的函數rand()來產生,其它方面也是能夠有相應的函數調用。rand函數怎麼實現就不說了。這裏說一下,如果沒有相應的函數來生成隨機數該怎麼辦?例如,我們現在考慮二維高斯分佈,那麼現在要產生這個分佈的數據該怎麼產生呢?如果是要產生的數據有一百維呢,一千維呢,一萬維呢(這個在圖像中很常見的)?雖然知道了這些數據的具體分佈,但是要怎麼產生樣本還是特別的困難。所以就有了MCMC方法了。

2.1Metropolis-Hastings algorithm 

首先這個算法的目的是:產生服從p(x)分佈的樣本數據,其中p(x) = f(x)/K.這裏的K爲一常數,但是不知道且很難計算,對於f(x)其表達式是已知的。

這裏爲Metropolis 算法的主要流程:

1.隨機的選取初始樣本x0.這裏f(x0)>0,當然了,作爲概率是應該要大於0的。

2.利用當前產生的x0去產生下一個樣本x1,要得到下一個樣本我們需要一個轉移概率或是稱作轉移分佈q(x0,x1),這個分佈可以自己選定。

3.對於給定的x1,計算α=p(x1)/p(x0) = f(x1)/f(x0);對於Metropolis-Hasting算法,轉移概率是需要加入到α的計算中去的,這樣α表達式爲:α=p(x1)*q(x0,x1)/(p(x0)*q(x1,x0) = f(x1)/f(x0),對於q如果是對稱的,就轉換成了Metropolis算法了。

4.決定x1是否接受:若α>1,則我們直接接受x1,若α<1,則我們就以α的概率接受這個x1.然後將x0= x1,返回到2繼續。

下面是用MATLAB編寫的算法:

%% 利用Metropolis-Hastings 算法產生樣本
% 這裏的樣本分佈爲:p(x) = C* x.^(-n/2)*exp(-a/(2x));
% 對於參數n=5,參數a=4.
xlen = 200000;
x = zeros(1,xlen);
x0 = 1 ;
len = length(x);
k = 1 ;
while k <= len
    nextx = 100*rand();
    %compute the p from x0
    pn = (nextx^(-2.5))*(exp(-2/(nextx)));
    p0 = (x0^(-2.5))*(exp(-2/(x0)));
    p = min(pn/p0,1);
    if p >= 1
        x(k) = nextx ;
        x0 = nextx ;
        k = k + 1 ;    
    else
        pp = rand();
        if pp < p
            x(k) = nextx ;
            x0 = nextx   ;
            k = k + 1 ;      
        end
       
    end
   
end
hist = histc(x(10000:k-1),0:0.1:100);
plot(hist);  
xx = 0:0.1:100;
n = 5 ;
a = 4 ;
C = 1 ;
y = C .* xx.^(-n/2).*exp(-a./(2*xx));
figure;
plot(y);

當然,這裏有個地方是不那麼明確,就是關於q(x,y)該怎麼選擇?關於q(x,y)的選擇主要有兩種:1,隨機漫步,即y的得到爲y=x+z,其中z爲一隨機變量,可以爲任何分佈產生的隨機變量,爲了簡單我們可以直接選取z爲均勻分佈,當然,均勻分佈的區間要看x分佈的而定。2,獨立選取一個分佈,即q(x,y)=g(y),g(y)爲我們選取的一個分佈,當g(y)不是對稱的時(g(y) != g(-y)),在式中計算α時用Metropolis-Hastings算法,當然,可以選一個最簡單的分佈---均勻分佈,這樣g(x) = g(y) = C。

 

這裏完成了一半,對於收斂度的證明不再講述。文獻參考爲《Markov Chain Monte Carlo and Gibbs Sampling》Lecture Notes for EEB 581, version 26 April 2004°c B. Walsh 2004。
發佈了31 篇原創文章 · 獲贊 9 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章