问题描述
我正在使用 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_data
和 Y_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 (将#修改为@)