仅在 PyMC3 中保存转换后的参数

Only save transformed parameters in PyMC3

我想在 PyMC3 中移动我的变量。我目前只使用 deterministic transforms,但是当我执行推理时,它会同时保存原始样本和移位样本(这是预期的行为)。

示例代码:

import pymc3 as pm

x_lower = -3

with pm.Model():
    x = pm.Gamma('x', alpha=2., beta=1.5)
    x_shift = pm.Deterministic("x_shift", x + x_lower)
    trace = pm.sample(1000, tune=1000)
trace.remove_values("x")  # my current solution

tp = pm.traceplot(trace)
# other analysis...

现在trace存储所有x个样本和所有x_shift个样本,当变量和样本数量增加时,这显然是一种浪费。我可以在继续分析之前做 trace.remove_values("x"),但我宁愿根本不保存 x

另一种选择是根本不保存 x_shift,但我找不到如何在推理后将 x_lower 添加到样本上。所以如果我想使用内置的分析工具,这并不是一个真正的解决方案。

当我sample?

您可以通过在 pm.sample() 函数中设置 trace 参数来准确指定要保存的内容,例如,

trace = pm.sample(1000, tune=1000, trace=[x_shift])

万一有人发现这个...

我寻求了一个仍然不能令人满意的解决方案:我不再使用 Deterministic 转换。我仍然转换变量,但不保存它们。我只是在采样后转换保存的(原始)样本。

上面的代码现在看起来像这样:

import pymc3 as pm

x_lower = -3

def f_x(x):
    return x + x_lower

with pm.Model():
    x = pm.Gamma('x', alpha=2., beta=1.5)
    x_shift = f_x(x)
    #keep = {"x": f_x}  # something like this for more variables
    trace = pm.sample(1000, tune=1000)
trace = {"x": f_x(trace["x"])}  # note this merges all chains
#trace = {varname: f(trace[varname]) for varname, f in keep.items()}

tp = pm.traceplot(trace)
# other analysis...

我认为 pm.traceplot(trace) 仍然适用于这种形式的 trace,但除此之外只需导入 arviz 并直接使用它 --- 它确实适用于这样的字典。

注意:注意更复杂的转换。例如您必须在模型中使用 pm.math.exp,但在 post 采样转换中使用 np.exp