如何解决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_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 举报,一经查实,本站将立刻删除。