当新数据可用时,我想使用我的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)
但是我想现在使用该模型在y
(例如)时获得x=126.2
的HPD并且初始数据集不包含观察到的x=126.2
< / p>
我理解后验采样的方式是数据集中每个可用的x
值都有10k个样本,因此ys
中没有x=126.2
对应的采样1}}因为它没有被观察到。
基本上,有没有办法使用我的模型从预测值x=126.2
获取可靠值的分布(基于模型),该值只在模型建立后才可用?
如果是这样,怎么样?
谢谢
编辑:
找到提及的SO Post
正在开发的功能(可能最终会添加到pymc3),以便为新数据预测后验。
这是否存在?
答案 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]
然后我可以使用
获取HPDpm.stats.hpd(sample)
数组([124.56126638,128.63795388])
Sklearn让我误以为应该有一个简单的predict
界面......