用PyMC3进行基本贝叶斯线性回归预测

时间:2017-04-15 11:43:07

标签: linear-regression pymc3

当新数据可用时,我想使用我的PyMC3 LR模型获得预测变量y的值的80%HPD范围。 因此,为y的新值推断x的值的可靠分布,而不是在原始数据集中。

型号:

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

但是我想现在使用该模型在y(例如)时获得x=126.2的HPD并且初始数据集不包含观察到的x=126.2 < / p>

我理解后验采样的方式是数据集中每个可用的x值都有10k个样本,因此ys中没有x=126.2对应的采样1}}因为它没有被观察到。

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

谢谢

编辑:
找到提及的SO Post

  

正在开发的功能(可能最终会添加到pymc3),以便为新数据预测后验。

这是否存在?

1 个答案:

答案 0 :(得分:4)

好的,所以它可能,或多或少如上面的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界面......