为什么我的pyro MCMC采样器不收敛于后验分布?

2024-09-30 20:35:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些度量单位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,1,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


Tags: importsizetorchsigmabeta样本tensorsamples