浅谈马尔科夫链蒙特卡罗方法(MCMC)算法的理解

1.解决的问题

计算机怎么在任意给定的概率分布P上采样?首先可以想到把它拆成两步:

(1)首先等概率的从采样区间里取一个待定样本x,并得到它的概率为p(x)

(2)然后在均匀分布U[0,1]上取一个值,如果这个值高于了样本出现的概率p(x),那么就舍弃掉这个待定样本,如果低于或等于这个值就保留。

不断重复这个步骤,我们就能得到满足概率分布P的样本X。

这个方法看似有效,但存在一个致命的问题,那就是慢,因为概率p的均值,随着采样的区域增大而减小【如果P是多维概率分布,那么随着维度不断增大,那么这个值将趋近于0,也就是维度灾难】,那么就意味着这个样本被保留下来的概率非常小。

那么怎么改进?

我们把上述的第(2)步改一下,不再用均匀U[0,1]进行采样,而是用U[0,max(p)],而选取的规则变为,如果从均匀分布U[0,max(p)]里取得的值u高于p(x),那么就保留该样本。

这样能够保证,至少有一个可能出现的样本在概率区间接受率为1。

这种改进比第一种的命中率要高上不少,如果p是均匀分布,那么采样命中率将是100%,当然如果采样是均匀分布,那么我直接取就好了,没必要多这么一步。

那么在此之上还有什么改进呢?

你自然能想到,我们不再用均匀分布U来计算样本是否可以保留,我们找一个好实现的概率分布Q,这个Q要和分布P相似,我们放缩该概率密度函数,使得min(q)>max(p)。

这样一来,命中率就又提高了,而且可以预想到,如果概率分布q=p那么采样命中率就会是100%,但这自然不可能。

那么有没有一种方法可以让采样的命中率是100%呢?

有,就是MCMC,在MCMC中,所有样本都是有效采样。而原理则是用频率取代概率。

2.MCMC

假设我们手里有个小球,每隔一秒就会变一种颜色(包括当前颜色),一段时间后,我们统计每种颜色的时间,就可以得到,各颜色出现的概率。

而这就是MCMC的原理,我们要做的是借助马尔可夫链,实现这样一个小球。

我们给小球输入一个指令,给定它每种颜色出现的概率,也就是P。

这时候小球内部有个状态机会来实现这个概率,首先会按照颜色的数量建立状态,同时每种状态之间会有线路连接,且每种状态之间都是相互可达的,即连通。

这时候有钢珠在每种状态里游走,钢珠到了哪种状态,哪种状态代表的灯就会亮起。

好了,如何让小球的灯能够以某种稳定的频率让灯亮起。

研究发现,只要让两两状态之间转换的概率与对方状态的概率乘积相等。

即P(A)Q(A->B)=P(B)Q(B->A),这就是马尔科夫链细致平衡条件,A和B代表任意两个状态。Q(A-B)是状态A到状态B的转移概率。

这时候,我们只要跟随钢珠在各状态之间的游走,记录下状态值即样本值,就能完成采样。

具体步骤如下,

(1)记录钢珠初始值状态X1。

(2)随机选择一个目标状态。

(3)查看抵达目标状态的转移概率。

(4)从U[0,1]中采一个值,如果值大于转移概率,那么状态不变,如果小于或等于转移概率,那么状态转化为目标状态。

重复如上步骤,就能得到一个服从P分布的样本了。

但这个算法虽然没有无效采样,但状态A转移到状态\bar{A}的转移概率过低,那么就会长时间卡在这一种状态。那么有没有方法改进呢。

当然有,那就是等比例缩放平衡方程两边的转移概率,P(A)Q(A->B)=P(B)Q(B->A)。

这里有个限制,那就是不能破坏转移概率小于或等于1概率特性,同时也不能破坏平衡方程本身。

那么我们能找到的一个缩放系数就是MAX[P(B->A),P(A->B)],两边同时除以该系数。

则有P(A)MIN[1,Q(A->B)/Q(B->A)] = P(B)MIN[1,Q(A->B)/Q(B->A)]

这样就能保证至少有一边可以必定转化为另一边。

到这里MCMC就算比较完整了。

问题就是Q怎么选。

这里有两种方案,一个就是Q任取,只要满足转移矩阵的要求,然后补一个系数配平方程

即: P(A)Q(A->B)*[P(B)Q(B->A)]=P(B)Q(B->A)*[P(A)Q(A->B)],

缩放后有:

P(A)Q(B->A)*MIN[1,P(B)Q(B->A)/P(B)Q(B->A)] = P(B)Q(B->A)*MIN[1,P(A)Q(A->B)/P(B)Q(B->A)]

另一种那就是选Q(A->B) = P(B),Q(B->A)=P(A)。

前者是HM的思想,配平的系数的使用方法类比前一节的转移接受率。

后者是Gibbs的思想。

具体实现有很多细节,可以看下面推荐的教学视频,这里推荐先看P6

 机器学习-白板推导系列-蒙特卡洛方法5(Monte Carlo Method)- 再回首_哔哩哔哩_bilibili

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于主从模式的Reactor的仿muduo网络库

🌇个人主页:平凡的小苏 📚学习格言:命运给你一个低的起点,是想看你精彩的翻盘,而不是让你自甘堕落,脚下的路虽然难走,但我还能走,比起向阳而生,我更想尝试逆风…

分布式系统中常用的缓存方案

1. 引言 随着互联网应用的发展和规模的不断扩大,分布式系统中的缓存成为了提升性能和扩展性的重要手段之一。本文将介绍几种在分布式系统中常用的缓存方案,包括分布式内存缓存、分布式键值存储、分布式对象存储和缓存网关等。 1.1 缓存在分布式系统中的…

数据结构c版(3)——排序算法

本章我们来学习一下数据结构的排序算法! 目录 1.排序的概念及其运用 1.1排序的概念 1.2 常见的排序算法 2.常见排序算法的实现 2.1 插入排序 2.1.1基本思想: 2.1.2直接插入排序: 2.1.3 希尔排序( 缩小增量排序 ) 2.2 选择排序 2.2…

WPS如何共享文件和文件夹

1 WPS共享单个文件 用WPS打开要分享的文件,点击右上角的“分享”键,选择上传到云端。 之后点击“创建并分享”,即可分享该文档。 2 WPS创建共享文件夹 2.1 如何共享文件夹 首先打开WPS,点击左上角的首页。在首页栏中&#…

Sqli-labs靶场第21、22关详解[Sqli-labs-less-21、22]自动化注入-SQLmap工具注入|sqlmap跑base64加密

Sqli-labs-Less-21、22 由于21/22雷同,都是需要登录后,注入点通过Cookie值进行测试,值base64加密 修改注入数据 选项:--tamperbase64encode #自动化注入-SQLmap工具注入 SQLmap用户手册:文档介绍 - sqlmap 用户手册 由…

SpringBoot+mybatisplus运行单元测试类报错unable to find a @SpringBootConfiguration

这个问题一般是因为启动类目录和测试类不一致,或者没有写使用SpringBootApplication注解的启动类。 1.如果没写启动类,请在与测试类同目录层级(注意是在main/java下对应的目录,即测试类在test/java下的目录为com.xxx则启动类需要…

代码随想录第45天|● 198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III

文章目录 ● 198.打家劫舍思路代码1.dp数组两个变量 ● 213.打家劫舍II思路:代码 ● 337.打家劫舍III思路代码: ● 198.打家劫舍 思路 代码 1.dp数组 class Solution {public int rob(int[] nums) {if(nums.length1)return nums[0];int[] dpnew int[nu…

6、JavaWeb-Mybatis

P116 Mybatis-入门 Mybatis是一款优秀的持久层框架,用于简化JDBC的开发。 持久层就是三层控制中的Dao层,数据访问层/持久层, P117 Mybatis-入门-快速入门程序 步骤: 创建springboot工程,数据表和实体类 引入mybat…

Centos7使用man查找命令时,报错No manual entry for xxxx

Centos7使用man查找命令时,报错No manual entry for xxxx 在Linux中使用man指令查找指令信息时,报No manual entry for xxxx。 比如使用man指令查找sleep3号手册时,出现以下错误: 这是由于没有安装man-pages这个rpm包导致的&#…

3、Linux-命令提示符与常用命令(一)

目录 一、命令提示符 二、命令格式 三、常用命令(一) 0、clear:清空终端窗口的内容。 1、ls:列出当前目录或指定目录下的文件和子目录 2、pwd:显示当前所在工作目录的完整路径。 3、cd:切换目录。 …

Redis的介绍与使用

文章目录 Redis简介安装RedisRedis常用命令全局命令String类型数据Hash哈希类型数据List列表类型数据Set集合类型数据SortedSet有序集合类型数据 一些选择题一些选择题 Redis简介 Redis是一款基于键值对的NoSQL数据库,它的值支持多种数据结构: 字符串(s…

数据结构之散列表

一、散列表的概念 散列表(Hash Table)又名哈希表/Hash表,是根据键(Key)直接访问在内存存储位置值(Value)的数据结构,它是由数组演化而来的,利用了数组支持按照下标进行随机访问数据的特性。 二…

MATLAB环境下基于频率滑动广义互相关的信号时延估计方法

时间延迟是声信号处理中的主要参数,要想确定信源距离、方位、速度等信息,就要能够精确、快速地估计时延及其他参数。所以,在信号处理领域中时延估计长期W以来都是的非常活跃的研究课题,在声纳、雷达、生物医学、通信、…

VS Code 的粘性滚动预览 - 类似于 Excel 的冻结首行

VS Code 的粘性滚动预览 - 类似于 Excel 的冻结首行功能,即滚动 UI 显示当前源代码范围。便于在代码行数比较多的时候更好的知道自己所在的位置。粘性滚动UI 显示用户在滚动期间所处的范围,将显示编辑器顶部所在的类/接口/命名空间/函数/方法/构造函数&a…

UE4 Niagara 关卡1.4官方案例解析

sprites can face the camera,or they can face any arbitrary vector,in this case the vector between the center of the system and the particle itself(粒子可以面对摄影机,也可以面对任意向量,在这个实例中的向…

激活函数(Activate Fuction)

注意:本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 ([www.aideeplearning.cn]) 激活函数的定义与作用 激活函数是深度学习、人工神经网络中一个十分重要的学习内容,对于人工神经网络模型去学习、理解非常复杂和非…

【数据结构与算法】常见排序算法(Sorting Algorithm)

文章目录 相关概念1. 冒泡排序(Bubble Sort)2. 直接插入排序(Insertion Sort)3. 希尔排序(Shell Sort)4. 直接选择排序(Selection Sort)5. 堆排序(Heap Sort)…

06 OpenCV增加图像的对比度

文章目录 理论API代码 理论 图像变换可以看作如下&#xff1a; 像素变换 – 点操作邻域操作 – 区域 调整图像亮度和对比度属于像素变换-点操作 API saturate_cast(value)确保值大小范围为0~255之间Mat.at(y,x)[index]value 给每个像素点每个通道赋值 代码 #include <…

Sqli-labs靶场第18关详解[Sqli-labs-less-18]自动化注入-SQLmap工具注入

Sqli-labs-Less-18 通过测试发现&#xff0c;在登录界面没有注入点&#xff0c;通过已知账号密码admin&#xff0c;admin进行登录发现&#xff1a; 返回了User Agent&#xff0c;设想如果在User Agent尝试加上注入语句&#xff08;报错注入&#xff09;&#xff0c;测试是否会…

one4all 排坑记录

one4all 排坑记录 任务踩坑回顾动作踩坑动作踩坑动作新一步测试Habitat-sim 测试habitat-lab继续ONE4ALL 任务 看了《One-4-All: Neural Potential Fields for Embodied Navigation》这篇论文&#xff0c;感觉挺有意思&#xff0c;他也开源了代码。视觉语言导航是我一直想做的…