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

Python 仅在PyMC3中保存转换后的参数,python,bayesian,pymc3,mcmc,Python,Bayesian,Pymc3,Mcmc,我想在PyMC3中转换变量。我目前只是在使用,但当我执行推断时,它会保存原始样本和移动样本,这是预期的行为 示例代码: 将pymc3作为pm导入 x_下限=-3 使用pm.Model: x=pm.γ'x',α=2.,β=1.5 x_移位=pm.Deterministicx_移位,x+x_下移 trace=pm.sample1000,tune=1000 trace.remove_值x我的当前解决方案 tp=pm.traceplotrace 其他分析。。。 现在trace存储所有x样本和所有x_移位

我想在PyMC3中转换变量。我目前只是在使用,但当我执行推断时,它会保存原始样本和移动样本,这是预期的行为

示例代码:

将pymc3作为pm导入 x_下限=-3 使用pm.Model: x=pm.γ'x',α=2.,β=1.5 x_移位=pm.Deterministicx_移位,x+x_下移 trace=pm.sample1000,tune=1000 trace.remove_值x我的当前解决方案 tp=pm.traceplotrace 其他分析。。。 现在trace存储所有x样本和所有x_移位样本,当变量和样本数量增加时,这显然是一种浪费。在继续分析之前,我可以执行trace.remove_valuesx,但我更希望根本不保存x

另一个选择是根本不保存x_移位,但我找不到如何在推断后将x_下移添加到样本中。因此,如果我想使用内置的分析工具,这并不是一个真正的解决方案


当我采样时,是否可以只保存x_shift样本,而不保存x样本?

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

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

但是,请注意,也许应该将其分配给PyMC?使用此参数时。也就是说,它还排除了一些内部变量,例如,创建ArviZ对象所需的对数可能性。由于PyMC3最近用ArviZ取代了它们的绘图功能,这意味着它将基本上打破所有绘图功能。因此,最终您的方法可能会更优越。

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

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

但是,请注意,也许应该将其分配给PyMC?使用此参数时。也就是说,它还排除了一些内部变量,例如,创建ArviZ对象所需的对数可能性。由于PyMC3最近用ArviZ取代了它们的绘图功能,这意味着它将基本上打破所有绘图功能。因此,最终你的方法可能会更优越。

如果有人发现这一点

我选择了一个仍然不令人满意的解决方案:我不再使用确定性转换。我仍然转换变量,但不保存它们。我只是在采样后转换保存的原始样本

以上代码现在如下所示:

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.tracePlotrace仍然可以使用这种形式的跟踪,但是如果不这样,只需导入arviz并直接使用它,它就可以像这样使用dict


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

如果有人发现此项

我选择了一个仍然不令人满意的解决方案:我不再使用确定性转换。我仍然转换变量,但不保存它们。我只是在采样后转换保存的原始样本

以上代码现在如下所示:

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.tracePlotrace仍然可以使用这种形式的跟踪,但是如果不这样,只需导入arviz并直接使用它,它就可以像这样使用dict


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

对于现在发现的人,ArviZ问题已经解决,这里的解决方案应该已经没有问题了。对于现在发现的人,ArviZ问题已经解决了,这里的解决方案应该已经没有问题了。