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.zeros(n_samples)
# Store initial value
samples[0] = z0
z = z0
# Compute the current likelihood
l_cur = p(z)
# Counter
iter = 0
# Total number of iterations to make to achieve desired number of samples
iters = (n_samples * m) + burn_in
# Sample outside the for loop
innov = np.random.normal(loc=0, scale=sigma, size=iters)
u = np.random.rand(iters)
while iter < iters:
# Random walk innovation on z
cand = z + innov[iter]
# Compute candidate likelihood
l_cand = p(cand)
# Accept or reject candidate
if l_cand / l_cur > u[iter]:
z = cand
l_cur = l_cand
# Only keep iterations after burn-in and for every m-th iteration
if iter > burn_in and iter % m == 0:
samples[(iter - burn_in) // m] = z
iter += 1
return samples
如果我们看一下性能,我们会发现这个实现比原来的实现快了两倍,这对于一些小的改变来说并不坏。在In [1]: %timeit Metropolis_Gaussian(pdf_t, 3, 1, n_samples=100, burn_in=100, m=10)
205 ms ± 2.16 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [2]: %timeit my_Metropolis_Gaussian(pdf_t, 3, 1, n_samples=100, burn_in=100, m=10)
102 ms ± 1.12 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
python运行mcmc为何老出错_为什么我的metropolis算法(mcmc)的python实现这么慢?相关推荐
- python运行mcmc为何老出错_python中mcmc方法的实现
MCMC方法在贝叶斯统计中运用很多,MIT发布的EMCEE是实现的比较好的.介绍页面在下面.源代码中examples里的代码可以帮助理解各种功能,特别是line.py 列出了最小二乘法,最大似然法和M ...
- python运行对电脑的要求_这样运行Python命令会给电脑带来极大的隐患
Python已经成为全球最受欢迎的编程语言之一.原因当然是Python简明易用的脚本语法,只需把一段程序放入.py文件中,就能快速运行. 而且Python语言很容易上手模块.比如你编写了一个模块my_ ...
- python中常用的序列化模块_第六章 常用模块(5):python常用模块(序列化模块:pickle,json,shelve,xml)...
6.3.7 序列化模块 (pickle,json,shelve,xml) 文件写入,数据传输时,我们都是以字符串形式写入的(因为字符串可以encode成bytes). 那其他类型(比如字典,列表等)想 ...
- bit是python最快的bitcoin库_新的Bitcoinpython节点比以前的Python库快100倍
3月27日,Bitcoin Cash(BCH)粉丝认识了用Python编程语言编写的新BCH完整节点. 该项目名为Bitcoinpython,是一个现代化的BCH库,其创建者声称它是速度最快的Pyth ...
- python如何赚外快 淘宝_业余时间怎么赚外快?用Python赚钱的5个方法!
Python作为一门编程语言,一门技术,就一定能够为我们所用,至少赚个外快是绝对没有问题的. 渠道一:淘宝搜python程序 可以到淘宝上搜,Python程序,到相应的店里找客服,就说你想做程序开发, ...
- python运行mcmc为何老出错_python – 使用pyMCMC / pyMC对数据/观察结果设置非线性函数...
我试图用高斯(和更复杂)的功能来适应一些数据.我在下面创建了一个小例子. 我的第一个问题是,我做对吗? 我的第二个问题是,如何在x方向添加错误,即在观察/数据的x位置? 很难找到关于如何在pyMC中进 ...
- python运行mcmc为何老出错_Python可视化解析MCMC
马尔可夫链可以定义为一个随机过程Y,其中t时刻各点的值只取决于t-1时刻的值.这意味着随机过程在t时刻有状态x的概率,给定它所有的过去状态,等于在t时刻有状态x的概率,给定它在t-1时刻的状态. 如果 ...
- python运行程序为什么会卡住_为什么我的 Python 程序卡住啦!
本文简答介绍在linux环境下如何利用gdb来分析卡住的程序,本文使用的Python为Cpython2.7,操作系统为Debian. 阻塞在IO 程序被卡住,很可能是程序被阻塞了,即在等待(wait) ...
- mysql环境搭载后老出错_使用Docker在window10下搭建SWOFT开发环境,mysql连接错误
使用Docker在window10下搭建SWOFT开发环境,mysql连接错误 { "code": 0, "error": "(Swoft\\Db\\ ...
最新文章
- centos 6.8 编译安装git 2.11.0
- django ---- models继承
- python dlib学习(六):训练模型
- python pycharm 如何绘制类图 关系图 继承图 父子图?
- 增加话务系统功能感想
- 数据库开发——MySQL——pymysql模块
- MySQL(五)MySQL事务
- LRU LeetCode
- physx选择显卡还是cpu_预算有限,该侧重CPU还是显卡?中高端游戏主机这样配
- Does Rails Hurt?
- linux桌面环境与窗口管理器,窗口管理器和桌面环境的区别 | MOS86
- linux修改ip配置文件路径,Centos7系统如何修改IP地址
- java中如何切割图片_Java 切割图片代码
- 对于NAS,IP SAN以及iSCSCI SAN存储的一些认识和理解
- 年底换机潮来了,都有哪些手机受欢迎?
- 注册测绘师学习笔记7
- LwM2M(轻量级M2M)协议
- excel合并两列内容_一起来学习Excel表格两列合并一列的两种方法
- 模糊控制理论理解与综述
- 二级域名三级域名设置方法