2017-04-15 128 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接口...