忽略 Gibbs 采样中的样本

Ignoring samples in Gibbs sampling

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):

那个额外的内部循环有什么意义?

原因似乎是在您的 Gibbs 抽样中引入了细化。细化用于减少连续样本之间相关性的影响。吉布斯采样生成样本的马尔可夫链,并且附近的样本是相关的,而通常的目的是抽取独立的样本。

为此,您可以仅使用每个 M-th 值,同时忽略所有中间值。在这种情况下,M 存储在变量 thinning 中,您只获取每个 thinning 值,然后在 for 循环下方打印。