如何在pymc3

时间:2018-02-01 14:42:12

标签: python theano pymc3

用例

假设我在y_0处有一个观察X_0,我想用高斯过程({1}}建模。假设我通过对后验进行分层抽样来确定超级参数theta中的分布。

现在,我想评估另一个观察的日志后验概率thetay_1,超过超参数分布的平均值, X_1 理想情况下,我会从 E_theta [ log P(y_1 | y_0, X_0, X_1, theta) ] 中的后验绘制并计算theta,然后取几何平均值。

问题1

假设我有一个采样结果,例如跟踪:

log P(y_1 | y_0, X_0, X_1, theta)

如何评估这些样本(或其中一部分)的另一个张量?我只能使用with pm.Model() as model: ... trace = pm.sample(1000) 定义为模型的一部分来找到部分解决方案,

pm.Deterministic

这感觉不完全正确。我觉得你应该能够在采样之后评估一部分迹线上的任何东西。

问题2

在pymc3中有一个with model: h = pm.Deterministic('h',thing_to_calculate_over_the_posterior) ### Make sure nothing then depends on h so it doesn't affect the sampling trace = pm.sample(1000) h_sampled = trace['h'] 的方法部分将创建代表pm.gp的张量或者我必须自己创建这个,这需要写出后验均值和协方差(已在{{1然后调用cholesky decomp等。

1 个答案:

答案 0 :(得分:1)

我将以此用例的示例回答。 基本上,从条件定义中单独采样, 然后使用下面方法2的方法1。

import numpy as np
import pymc3 as pm

# Data generation
X0 = np.linspace(0, 10, 100)[:,None]
y0 = X0**(0.5) + np.exp(-X0/5)*np.sin(10*X0)
y0 += 0.1*np.random.normal(size=y0.shape)
y0 = np.squeeze(y0)

# y1
X1 = np.linspace(0, 15, 200)[:,None]
y1 = X1**(0.5) + np.exp(-X1/6)*np.sin(8*X1)
y1 = np.squeeze(y1)

# 'Solve' the inference problem
with pm.Model() as model:
    l = pm.HalfNormal('l',5.)
    cov_func = pm.gp.cov.ExpQuad(1, ls=l)
    gp = pm.gp.Marginal(cov_func=cov_func)
    y0_ = gp.marginal_likelihood('y0',X0,y0,0.1)
    trace = pm.sample(100)

# Define the object P(y1 | X1 y0 X0)
with model:
    y1_ = gp.conditional('y1',X1,given={'X':X0,'y':y0,'noise':0.1})
    # Note the given=... is not strictly required as it's cached from above

###
# Method 1

logp = y1_.logp
logp_vals1 = []
for point in trace:
    point['y1'] = y1
    logp_vals1.append(logp(point))
    # note this is approximately 100x faster than logp_vals1.append(y1_.logp(point))
    # because logp is a property with a lot of overhead

###
# Method 2

import theano
y1_shr = theano.shared(y1)
with model:
    logp = pm.Deterministic('logp', y1_.distribution.logp(y1_shr))

logp_val2 = [pm.distributions.draw_values([logp], point) for point in trace]

方法1在我的机器上显示速度提高了2-3倍。