我有一些度量单位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()
我试图用均匀分布或其他正态分布来改变先验分布,但产生的样本总是与先验分布相似
目前没有回答
相关问题 更多 >
编程相关推荐