如何自己去写一个鼠标驱动_为什么要用哈密顿采样器(Hamiltonian Monte Carlo),以及如何自己写一个...

背景介绍:(了解采样的可以跳过)

1)为什么需要采样:

简单的分布,比如高斯、exponential、gamma等等的样本都可以直接用numpy.random生成,但复杂的分布需要采样器生成。在贝叶斯、概率编程里面,有很多复杂的分布,而贝叶斯更新需要对这些复杂分布再采样。

2)最简单的3种采样:

  • CDF采样:(把pdf转成cdf,然后对0-1区间均匀采样)

f3b5a3d0a1462c786bc7ff5092e24714.png
  • 拒绝采样:

蓝线是真实分布,红线是一个处处y坐标值大于蓝线的函数(正比于一个简单分布,比如均匀分布,或者高斯分布,或者一个分段函数),对红线的分布采样得到样本x,然后计算蓝线(x)/红线(x)作为接受这个样本的概率。

fb9e7783e6d7dbef9a082e64facd9dd2.png
  • 重要性采样

类似拒绝采样,不需要红线函数处处大于蓝线,但每个样本x的权重是蓝线(x)/红线(x)

cbefc7d4e6b9b82de62ce12ea1e820ea.png

3)以上三种采样的问题:

  • cdf采样需要一个数值积分,所以在高维空间采样的时候计算量太大
  • 拒绝采样需要先构造一个总是值大于自己的函数
  • 重要性采样在对分布情况不太清楚的时候采样方差可能很大,即大部分样本的权重都很低
  • 都或多或少需要对分布本身有一定了解,在高维空间不够高效

4)Metropolis-Hastings:

特点:用一个多元正态分布随机游走,不需要对分布本身有太多了解,高维空间时有效,分布本身不需要积分=1,基本只需要保证f(x)在-∞和+∞处=0,0<f(x)<upper bound就行了。

方法:初始点=>随机游走=>如果

则接受这个新的样本,否则按照
的概率接受这个采样。

问题:随机游走的效率仍然不够高。

代码:

def binormal_draw(xprev,beta=1):mean = [0, 0]cov = [[beta**2,0],[0,(1.5*beta)**2]]binormal = scipy.stats.multivariate_normal(mean,cov)return xprev + binormal.rvs()def metropolis(F, qdraw, nsamp, x_init, burnin, thinning=2, beta=1):samples=np.empty((nsamp,2))x_prev = x_initaccepted = 0j = 0for i in range((nsamp+burnin)*thinning):x_star = qdraw(x_prev, beta)logp_star = np.log(F(x_star[0], x_star[1]))logp_prev = np.log(F(x_prev[0], x_prev[1]))logpdfratio_p = logp_star-logp_prevu = np.random.uniform()if np.log(u) <= logpdfratio_p:x_prev = x_starif i >= burnin*thinning and i%thinning == 0:samples[j] = x_starj += 1accepted += 1else:#we always get a sampleif i >= burnin*thinning and i%thinning == 0:samples[j]= x_prevj += 1return samples, accepted

可视化:

http://elevanth.org/blog/2017/11/28/build-a-better-markov-chain/​elevanth.org

ba5bd1da349970de504c66921bf876e8.png

HMC:

1)直观理解原理:把MCMC的样本随机游走改成在一个势场中具有动能的质点,势场由分布函数f(x)决定,初始动能随机给定,这个质点在运动时间t后的位置记录下来,并且作为下次采样的初始点。

2)相比MH的优点:更新样本点的时候使用了梯度,所以对复杂分布采样比随机试的速度要快。

2)公式、可视化:参考下列文章

35de54247d920f659df8f28d6f49e9ee.png
Markov Chains: Why Walk When You Can Flow?​elevanth.orgXinyu Chen:如何简单地理解「哈密尔顿蒙特卡洛 (HMC)」?​zhuanlan.zhihu.com
https://theclevermachine.wordpress.com/2012/11/18/mcmc-hamiltonian-monte-carlo-a-k-a-hybrid-monte-carlo/​theclevermachine.wordpress.com
2264dfcfa73fb73fbbef00d4a2431216.png
MCMC: Hamiltonian Monte Carlo (a.k.a. Hybrid Monte Carlo)​theclevermachine.wordpress.com
2264dfcfa73fb73fbbef00d4a2431216.png
https://arxiv.org/pdf/1701.02434.pdf​arxiv.orgHamiltonian Monte Carlo explained by Alex Rogozhnikov​arogozhnikov.github.io
9f9fac362c7b4efeb463a262599d361a.png

3)代码:

def HMC(F, u0, n_iter, N_iter, h=0.01): # part 1: 初始化一个orbit的变量,第一行是初始点u0的坐标orbit = torch.zeros((n_iter+1, 2))orbit[0] = u0.detach()u = orbit[0].unsqueeze(0)shape = u.size()# part 2: 循环n_iter次,每次初始化一个v0和u0,然后让leapfrog走N_iter次,每次时长h默认=0.01for k in tqdm(range(n_iter)):v0 = torch.randn(size=u0.shape)u0 = torch.randn(size=u0.shape)*3u, v = leapfrog(F, u0, v0, h, N_iter,shape)u0 = orbit[k]a = float(ratio(F, u0, v0, u, v, shape))r = np.random.rand()if r < a:orbit[k+1] = uelse:orbit[k+1] = u0return orbit #[10:, :]# part 3: leapfrog算法,此外还有velocity verlet等等都可以尝试,但不要用euler
def leapfrog(F, u, v, h, N_iter,shape):v = v - h/2 * grad(F, u)for i in range(N_iter-1):u = u + h * vv = v - h * grad(F, u)u = u + h * vv = v - h/2 * grad(F, u)return u, v# part 4: 对函数F求梯度
def grad(F, u):u = u.detach()if u.requires_grad == False:u = u.requires_grad_()output = -torch.log(F(u))output.backward()ugrad = u.grad.squeeze(0)u = u.squeeze(0)return ugrad# part 5: 细节处理
def unsqueeze(tensor, shape):if len(list(tensor.size())) < len(list(shape)):tensor = tensor.unsqueeze(0)return tensor# part 6: 由于leapfrog计算结果仍然不是绝对的稳定,所以接受概率是min{运行前后总能量的比值,1}
#,大多数情况下都≈1
def ratio(F, u0, v0, u, v, shape):u0 = unsqueeze(u0, shape)u = unsqueeze(u, shape)v0 = unsqueeze(v0, shape)v = unsqueeze(v, shape)w0 = - torch.log(F(u0)) + 0.5*torch.mm(v0, torch.t(v0))w1 = - torch.log(F(u)) + 0.5*torch.mm(v, torch.t(v))return torch.exp(w0-w1)

4)调参细节:

一共有5组主要的超参要调,v0的标准差,u0的位置和标准差,时间步长h,总步长数N_iter,burning。

5)效果:

此处暂时无图。。不过采样的速度总体比Metropolis Hastings要稳定,样本质量较高,使用了梯度所以效率高。

6)进阶:NUTS采样

The No-U-Turn Sampler: Adaptively Setting Path Lengths in Hamiltonian Monte Carlo​arxiv.org

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564796.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java inputstream read_20191209-java部分流处理

流:流一般分为输入流(InputStream)和输出流(OutputStream)两类.但这种划分并不是绝对的.在Java开发环境中,主要是由包http://java.io中提供的一系列的类和接口来实现输入和输出处理.标准输入和输出处理则是由包java.lang中提供的类来处理的,但这些类又都是从包http://java.io中…

平稳序列的预测和拟合之模型识别

目录 1.计算样本相关系数和偏自相关系数 2.模型识别 模型定阶的困难 样本相关系数的近似分布及模型定阶经验方法 例题&#xff1a; 2.参数估计 常用估计方法&#xff1a; 1.矩估计 2.极大似然估计 3.最小二乘估计 R中&#xff0c;参数估计用arima函数 例题 小结 1.计算…

python自增_Python的自增运算与Python变量的浅析

一、关于Python的自增运算 学了C/C后再学习Python&#xff0c;不自觉地就打出了自增运算符&#xff0c;但是发现Python解释器不认识&#xff0c;查了下资料&#xff0c;发现Python中没有这个运算符。这里暂时不探讨自增运算符的内部实现原理&#xff0c;从语言设计角度来说&…

平稳序列的预测和拟合之模型检验

目录 1.模型的显著性检验 R语言实现 例题 2.参数显著性检验 例题 小结 1.模型的显著性检验 检验模型的有效性&#xff08;对信息的提取是否充分) 判定原则&#xff1a; 一个好的拟合模型应该能够提取几乎所有的样本相关信息&#xff0c;即残差序列应该为白噪声序列。反之…

oracle数据如何获取游标中动态字段_原来Python自带了数据库,用起来真方便!

Python大数据分析记录 分享 成长Python作为数据科学主流语言&#xff0c;被广泛用于数据读存、处理、分析、建模&#xff0c;可以说是无所不能。数据一般存放在本地文件或者数据库里&#xff0c;之前介绍过如何使用python读取本地文件&#xff0c;也对# PyMySQL、cx_Oracle…

平稳序列的预测和拟合之模型优化

目录 前提 准则 1、AIC准则 2、SBC &#xff08;BIC)准则 优化 小结 前提 问题提出:模型通过检验&#xff0c;说明是有效的&#xff0c;但有效的模型不唯一。 下面我们用一个例子来解释一下&#xff1a; 例4-7:试对某次化学反应的70个过程数据序列进行拟合。 d<-r…

css中如何实现帧布局_浅谈web前端中的表格布局与CSS盒子布局

在web前端设计排版时我们可能会用到表格布局和divCSS布局&#xff0c;但现在主要使用后者&#xff0c;为何&#xff1f;今天我们来谈一谈两者之间的发展和原理。话不多说下面来干货发展过程上个世纪Web开发人员流行使用表格进行文档整体布局。因为当时大部分浏览器不支持CSS&am…

油猴的简介和安装

目录 1.油猴简介 2.油猴插件安装 方法1 方法2 3.获取油猴脚本 4.脚本的使用 4.1 脚本的设置及功能 4.2 安装油猴脚本 4.3 新建脚本 5.脚本编写方法 功能注释 脚本权限 编写脚本 1.油猴简介 油猴脚本是一款免费的浏览器扩展和最为流行的用户脚本管理器&#xff0c…

Logistic回归——二分类 —— matlab

目录 1.简介 2.应用范围 3.分类 3.应用条件 4.原理详解 4.1 sigmod分类函数 4.2 建立目标函数 4.3 求解相关参数 5.实列分析 5.1 读取数据&#xff08;excel文件&#xff09; 5.2 分离数据集 5.3 求解前设定 5.4 求解目标函数 5.5 预测 5.6 预测分类 5.7 准确率…

java 抽象类_java中的抽象类

普通类可以直接产生实例化对象&#xff0c;并且在普通类之中可以包含有构造方法、普通方法、static方法、常量、变量的内容。而所谓的抽象类就是指在普通类的结构里面增加抽象方法的组成部分&#xff0c;抽象方法指的是没有方法体的方法&#xff0c;同时抽象方法还必须使用abst…

Logistic回归——二分类 —— python

目录 1.简介 2.应用范围 3.分类 3.应用条件 4.原理详解 4.1 sigmod分类函数 4.2 建立目标函数 4.3 求解相关参数 5.实列分析 5.1 导入库 5.2 读取数据&#xff08;excel文件&#xff09; 5.3 分离数据集 5.4 求解前设定 5.5 求解目标函数 5.6 预测 5.7 预测分类…

dubbo官方文档_狂神说SpringBoot17:Dubbo和Zookeeper集成

狂神说SpringBoot系列连载课程&#xff0c;通俗易懂&#xff0c;基于SpringBoot2.2.5版本&#xff0c;欢迎各位狂粉转发关注学习。未经作者授权&#xff0c;禁止转载分布式理论什么是分布式系统&#xff1f;在《分布式系统原理与范型》一书中有如下定义&#xff1a;“分布式系统…

第一个脚本-HelloWorld

目录 前言 脚本的作用 创建脚本 开始编写我们这次的HelloWorld的对话框 前言 我的扩展主要使用:Tampermonkey&#xff0c;当然其他的有类似功能的也可以&#xff0c;我们就将这些统称为油猴吧。 本节主要内容: 描述脚本的作用和油猴,脚本的基本结构,创建一个脚本,使它能够…

bme280 环境传感器开发板_STM32Cube14 | 使用硬件I2C读写环境光强度传感器

更多精彩~点击上面蓝字关注我们呀&#xff01; 寻求更好的阅读体验&#xff0c;请点击阅读原文移步&#xff1a;Mculover666的个人博客。本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件I2C外设读取环境光强度传感器数据(BH1750)。1. 准备工作硬件准备开发板首先…

平稳序列的拟合和预测之序列的预测

目录 1.线性预测函数 2.预测方差最小原则 3.线性最小方差预测的性质 AR(p)序列的预测 例题 R语言预测举例 MA(q)序列的预测 例题 ARMA(p,q)序列预测 例题 小结 序列只有为非白噪声时才可以进行预测哦&#xff01;&#xff01; 1.线性预测函数 根据平稳性和可逆性&…

vue 浏览器调试 样式如何定位样式_浏览器断点调试-程序员的必修课

一、源码调试/debugger方法1.1控制台调试按钮介绍Resume script execution恢复断点调试、常用在一个方法调用多个js文件(适用冗长js代码使用)、点击这个会直接跳转到下一个断点(逐过程执行)Pause script execution停止断点调试step over next function call逐语句执行&#xff…

https open api_Web上的分享(Share)API

我认为Web Share API非常酷&#xff0c;简而言之&#xff0c;它会利用您所使用的平台上的原生共享功能(如果该平台支持的话)。我喜欢这个&#xff1a;远远不止这些东西&#xff1a;为什么&#xff1f;Web Share API只是几行代码。简单&#xff01;没有图像&#xff0c;没有重量…

无季节效应的非平稳序列分析(一)

目录 Cramer分解定理&#xff08;1961年提出&#xff09; 差分 R语言函数 diff 例题&#xff1a; 过差分&#xff1a; 小结 Cramer分解定理&#xff08;1961年提出&#xff09; 任何一个时间序列 都可以分解为两部分的叠加:其中一部分是由多项式决定的确定性趋势成分&a…

求一个任意实数c的算术平方根g的算法设计思想_算法复习第四篇——贪心法

公元2020年5月5日&#xff0c;距离算法考试仅剩4天。一、知识归纳1.设计思想只根据当前已有的信息就做出选择&#xff0c;而且一旦做出了选择&#xff0c;将来无论如何都不能更改不从整体最优考虑&#xff0c;所做的选择只是在某种意义上的局部最优这种选择并不总能获得整体最优…

安装百分之80卡住_关注丨男子翻越高铁站台丢命,家属向铁路部门索赔80万!法院这样判...

去年3月&#xff0c;一名男子翻越高铁站台被卡住致死引发广泛关注。事发后&#xff0c;其家属将铁路部门告上法庭&#xff0c;索赔80余万元。日前&#xff0c;法院宣判&#xff1a;死者杨某擅自闯入危险区域负全责&#xff0c;其父母要求铁路部门赔偿的诉请被驳回。事件还原201…