2017-04-15 198 views
3

我想用我的PyMC3 LR模型来获得预测变量y的值的80%HPD范围,因为新数据可用。 因此,外推y的值的可信分布值为x的新值不在我的原始数据集中。用PyMC3进行基本贝叶斯线性回归预测

型号:

with pm.Model() as model_tlr: 
    alpha = pm.Normal('alpha', mu=0, sd=10) 
    beta = pm.Normal('beta', mu=0, sd=10) 
    epsilon = pm.Uniform('epsilon', 0, 25) 

    nu = pm.Deterministic('nu', pm.Exponential('nu_', 1/29) + 1) 
    mu = pm.Deterministic('mu', alpha + beta * x) 

    yl = pm.StudentT('yl', mu=mu, sd=epsilon, nu=nu, observed=y) 

    trace_tlr = pm.sample(50000, njobs=3) 

从后燃尽我的样品,并得到一个HPD

ppc_tlr = pm.sample_ppc(btrace_tlr, samples=10000, model=model_tlr) 
ys = ppc_tlr['yl'] 
y_hpd = pm.stats.hpd(ys, alpha=0.2) 

这是伟大的可视化HPD围绕集中趋势后(使用fill_between) enter image description here

但我想现在使用该模型来获得HPD为yx=126.2 (例如)并且初始数据集不包含观察x=126.2

我理解后验采样的方式是数据集中每个可用的x值都有10k个采样,因此没有因为没有观察到,所以在ysx=126.2的相应采样。

基本上,有没有一种方法可以使用我的模型从预测值x=126.2获得可信值的分布(基于模型),该预测值在模型建立后才可用? 如果是这样,怎么样?

谢谢

编辑:
找到SO Post其中提到正在开发

功能(可能最终会加入到pymc3),将允许预测新数据后验。

这是否存在?

回答

3

好的,所以可能,或多或少如上述SO帖子中所述。 但是,此后一直有一个sample_ppc函数添加到PyMC3中,这使得作者的run_ppc变得冗余。

首先,为x设置一个Theano共享变量。

from theano import shared 
x_shared = shared(x) 

然后在构建模型时使用x_shared。

模型建成后,添加新的数据和更新该共享变量

x_updated = np.append(x, 126.2) 
x_shared.set_value(x_updated) 

重新运行与原始跟踪的PPC样本发生器和模型对象

new_ppc = pm.sample_ppc(btrace_tlr, samples=10000, model=model_tlr) 

的采样新基准的后验与

sample = new_ppc['yl'][:,-1] 

然后我可以得到HPD与

pm.stats.hpd(sample) 

阵列([124.56126638,128.63795388])

Sklearn已经把我宠坏了,以为应该有一个简单的predict接口...