微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我的pyro MCMC采样器没有收敛到后验分布?

如何解决为什么我的pyro MCMC采样器没有收敛到后验分布?

我有一些测量值 Ymes,在 xMes 中测量,具有一些不确定性 sigma_mes。 我要校准的模型是 Ymes=f(xMes,beta)。 Beta 是一个 4 大小的张量,我想从pyro 的 MCMC 中采样,f 是一个简单的多项式函数

我定义了 beta 的先验分布,并定义了可能性。我希望采样器从后验分布中生成样本,但 MCMC 采样器生成的样本与先验分布完全一样。

我的代码

from numpy import *
import torch
import pyro
import pyro.infer
import pyro.distributions as dist

def f(x,beta): # beta is a 4-size tensor
  beta=beta.detach().numpy()
  return beta[0]+ beta[1]*x+beta[2]*x**2+beta[3]*x**3 

betaTrue=torch.tensor(array([0.2,0.4,1,0.5])) # the true values of beta
paramDim=betaTrue.size()[0]

sigma_mes=0.1 # my uncertainty in the measures

xMes=arange(0,step=0.025)
Ymes=torch.tensor(f(xMes,betaTrue)+sigma_mes*random.randn(xMes.size))

calIni={}
calIni['Beta'] = torch.tensor([0.5]*paramDim).double() # Beta initial value

#Model creation for MCMC
def model(y):

    beta = pyro.sample("Beta",dist.normal(0,1).expand([paramDim]).to_event(1)) #Beta prior distribution
    sigma_mes=0.1
    sig2Mes = torch.as_tensor( [sigma_mes**2]*xMes.size ).double()
    yPred = torch.tensor(f(xMes,beta))

    covL = torch.diag(sig2Mes)
    with pyro.plate('obs_loop'):
      likelihood = pyro.sample('y',dist.Multivariatenormal(yPred,covL),obs=y) #Likelihood

    return likelihood

n_samples=5000
nuts_kernel = pyro.infer.NUTS(model,adapt_step_size=True,jit_compile = True,target_accept_prob = 0.95)
mcmc = pyro.infer.MCMC(nuts_kernel,num_samples=n_samples,warmup_steps=1000,initial_params=calIni)
res = mcmc.run(Ymes)
samples_MCMC = mcmc.get_samples()['Beta'].detach().numpy()

我尝试通过使用均匀分布或其他正态分布来更改先验分布,但生成的样本始终与先验分布相似。

Picture of samples produced

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。