假设我在y_0
处有一个观察X_0
,我想用高斯过程({1}}建模。假设我通过对后验进行分层抽样来确定超级参数theta
中的分布。
现在,我想评估另一个观察的日志后验概率theta
在y_1
,超过超参数分布的平均值,
X_1
理想情况下,我会从
E_theta [ log P(y_1 | y_0, X_0, X_1, theta) ]
中的后验绘制并计算theta
,然后取几何平均值。
假设我有一个采样结果,例如跟踪:
log P(y_1 | y_0, X_0, X_1, theta)
如何评估这些样本(或其中一部分)的另一个张量?我只能使用with pm.Model() as model:
...
trace = pm.sample(1000)
定义为模型的一部分来找到部分解决方案,
pm.Deterministic
这感觉不完全正确。我觉得你应该能够在采样之后评估一部分迹线上的任何东西。
在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等。
答案 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倍。