python运行mcmc为何老出错_为什么我的metropolis算法(mcmc)的python实现这么慢?

我回答了similar question previously。我在这里提到的很多东西(不计算每次迭代的当前可能性,预先计算随机创新等等)都可以在这里使用。在

实现的其他改进是不使用列表来存储示例。相反,您应该为样本预先分配内存,并将它们存储为数组。类似samples = np.zeros(n_samples)的方法比在每次迭代时追加到列表中更有效。在

你已经提到你试图通过不记录老化样本来提高效率。这是个好主意。您也可以通过只记录每m个样本来完成类似的细化操作,因为无论如何,您在return语句中使用np.array(sample_list)[::m]丢弃这些样本。你可以通过改变:# do not add burn-in samples

if n_sampled > burn_in:

sample_list.append(z)

^{pr2}$

还值得注意的是,您不需要计算min(1, p(cand) / p(z)),只需计算p(cand) / p(z),就可以逃脱惩罚。我意识到形式上min是必要的(以确保概率在0和1之间有界)。但是,计算上,我们不需要最小值,因为如果p(cand) / p(z) > 1,那么{}总是大于u。在

把这一切放在一起,并预先计算随机创新,接受概率u,只有在你真的需要我想出的时候才计算可能性:def my_Metropolis_Gaussian(p, z0, sigma, n_samples=100, burn_in=0, m=1):

# Pre-allocate memory for samples (much more efficient than using append)

samples = np.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值