MCMC 用后验保存中间值的样本?

问题描述

我正在使用 Pyro 进行一些复杂计算参数的 MCMC 推断。有没有办法保留使用推断变量进行的计算值?

代码的简化版本是:

def model(X_data,Y_data):
    #X_data,and Y_data are column vectors
    A = pyro.sample('A',dist.normal(loc = 100.0,scale = 10.0)).double()
    B = pyro.sample('B',dist.normal(loc = 25.0,scale = 2.0)).double()
    C = pyro.sample('C',dist.normal(loc = 10.0,scale = 1.0)).double()
    D = pyro.sample('D',dist.normal(loc = 400.0,scale = 50.0)).double()
    
    #Calculate Z for every value of X_data,return as column vector
    Z = some_complicated_calulation(A,B,C,D,X_data)

    #Create a distribution around Z
    Y_predicted = dist.normal(loc = Z,scale = 10.0)

    #Sample from that distribution,and compare to observed data in Y_data
    pyro.sample('obs',Y_predicted,obs = Y_data)

kernel = NUTS(model,max_tree_depth=3,adapt_step_size=True)
posterior = MCMC(kernel,num_samples=200,warmup_steps=20)
posterior.run(X_grid,Y_grid)

其中 X_dataY_data 是训练数据集,以及两个 Torch 张量列向量(即形状类似于 (8,1) 的东西)。

当我运行它并调用 posterior.get_samples() 时,它返回 A、B、C 和 D 的后验 - 每个都是 shape(200)。但我也想要 Z 的后部,它应该有一个形状 (8,200)。

NUTS 采样器在后台执行 Z 的 200(或 220)次计算要多得多,因此使用外部列表、张量或字典似乎不起作用。 我的想法是这可以用 pyro.param 来完成,但我不清楚如何做到这一点。

我的最终目标是为未测量的 X 值的测试集获得 some_complicated_calculation 的置信区间。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)