我正在尝试创建第175页上的相同的Gibbs采样器 http://www.people.fas.harvard.edu/~plam/teaching/methods/mcmc/mcmc.pdf 这是用R编写的,但我试图用python编写。
我的代码是
from numpy import *
import matplotlib.pylab as pl
def gibbs_sampler(alpha,delta,gamma,y,t):
#initialize beta
beta=1
num_iter=100
beta_draws=[]
lambda_draws=[]
for i in range(num_iter):
#sample lambda given other lambdas and beta
lambdas=lambda_update(alpha,beta,y,t)
#record sample
lambda_draws.append(lambdas)
#sample beta given lambda samples
beta=beta_update(alpha,gamma,delta,lambdas,y)
#record sample
beta_draws.append(beta)
pl.plot(array(beta_draws))
pl.show()
def lambda_update(alpha,beta,y,t):
new_alpha=[(x+alpha) for x in y]
new_beta=[(a+beta) for a in t]
#sample from this distribution 10 times
samples=random.gamma(new_alpha,new_beta)
return samples
def beta_update(alpha,gamma,delta,lambdas,y):
#get sample
sample=random.gamma(len(y)*alpha+gamma,delta+sum(lambdas))
return sample
def main():
y=[5,1,5,14,3,19,1,1,4,22]
t=[94,16,63,126,5,31,1,1,2,10]
alpha=1.8
gamma=0.01
delta=1
gibbs_sampler(alpha,delta,gamma,y,t)
if __name__ == '__main__':
main()
然而,我的样本很快就会变成无穷大,这很糟糕。谁能看到我在哪里错了?我是否以正确的方式从Gamma分布中采样?
由于
答案 0 :(得分:6)
问题是numpy.random.gamma使用了与R的rgamma函数默认的伽玛分布不同的参数化。 numpy.random.gamma的参数是形状和比例,而rgamma函数可以成形和速率(它也可以采用比例,但你的代码使用的是速率)。您可以通过反转将速率转换为比例。这是固定代码:
from numpy import *
import matplotlib.pylab as pl
def gibbs_sampler(alpha,delta,gamma,y,t):
#initialize beta
beta=1
num_iter=100
beta_draws=[]
lambda_draws=[]
for i in range(num_iter):
#sample lambda given other lambdas and beta
lambdas=lambda_update(alpha,beta,y,t)
#record sample
lambda_draws.append(lambdas)
#sample beta given lambda samples
beta=beta_update(alpha,gamma,delta,lambdas,y)
#record sample
beta_draws.append(beta)
pl.plot(beta_draws)
pl.show()
def lambda_update(alpha,beta,y,t):
new_alpha=[(x+alpha) for x in y]
new_beta=[1.0/(a+beta) for a in t]#Changed here
#sample from this distribution 10 times
samples=random.gamma(new_alpha,new_beta)
return samples
def beta_update(alpha,gamma,delta,lambdas,y):
#get sample
sample=random.gamma(len(y)*alpha+gamma,
1.0 / (delta+sum(lambdas)))#Changed here
return sample
def main():
y=[5,1,5,14,3,19,1,1,4,22]
t=[94,16,63,126,5,31,1,1,2,10]
alpha=1.8
gamma=0.01
delta=1
gibbs_sampler(alpha,delta,gamma,y,t)
if __name__ == '__main__':
main()