2015-06-14 37 views
1
import random,math 

def gibbs(N=50000,thin=1000): 
    x=0 
    y=0 
    print "Iter x y" 
    for i in range(N): 
     for j in range(thin): 
      x=random.gammavariate(3,1.0/(y*y+4)) 
      y=random.gauss(1.0/(x+1),1.0/math.sqrt(2*x+2)) 
     print i,x,y 

gibbs() 

上面的python代碼是吉布斯採樣和下面的行混淆了我。忽略Gibbs採樣中的樣本

for j in range(thin): 

那個額外的內循環的意義是什麼?

+0

重複'for'循環'thin'次的主體? (請注意'x'和'y'都是在主體中讀取和分配的) –

+0

我知道。但是動機是什麼? – Wyatt

回答

1

原因似乎是在你的吉布斯採樣中引入了細化。細化用於減少連續採樣之間相關性的影響。 Gibbs採樣生成樣本的馬爾可夫鏈,並且附近的樣本是相關的,而通常意圖是繪製獨立的樣本。

要達到這個目標,您只能使用每個M-th值,而忽略所有中間值。在這種情況下,M存儲在變量thinning中,並且您僅採用每個thinning值,然後將該值打印在for循環的下面。