忽略 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 循环下方打印。
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 循环下方打印。