写给小白看的马尔科夫链(Markov Chain)最佳入门教程
1 什么叫马尔科夫链?
讲马尔可夫链不得不提到随机过程,它本身就是随机过程课本中的重要内容,犹如牛顿定律在力学中的地位。那何为随机过程呢?
我们知道,人类认知世界是从运动开始的,从宏观的天体运动到微观的分子运动,它都是一个“东西”随时间变化的过程,牛顿的出现,很好地体系化地解释了我们所熟悉的大部分运动,并赋能人类能够对一些运动进行准确计算并预测运动。但是世界上仍存在大量的非确定因素的“运动”过程,之所以给给运动加引号是因为这是个概性描述,比如经典掷色子,每一次掷色子都视为一次事物的变化,归为“运动”,即随时间事物产生的变化。我们都知道无穷大样本下1-6每个数字出现的概率都是1/6,但想知道每一次掷色子的结果,我们永远无法准确计算预知,我们能想到的最好办法,就是用:概率(论),来描述这个结果。犹如牛顿定律在力学中所扮演的进行力学分析的角色,随机过程就是在概率论中,对事物变化研究运动的方法,对不确定性下的运动进行准确的数学描述。如同力学中对速度,加速度等概念的数学定义,随机过程中也定义了两个最重要的概念:概率空间、随机变量,在此不深入聊。
牛顿力学中,是确定性过程研究一个量随时间确定的变化,而随机过程描述的是一个量随时间可能的变化。在这个过程里,每一个时刻变化的方向都是不确定的,随机过程就是由这一系列不确定的随机变量组成的。每一个时刻系统的状态都由一个随机变量表述,整个过程则构成一个随机过程的实现。
知道了什么是随机过程后,我们可以试想一个最简单的随机过程,这个过程由N步组成,每一步都有两个选择(0,1),那么可能的路径就有2的N次方个,这个随机过程就要由2^N这个指数级别个数的概率来描述,我们一看指数级别!?维度这么大岂不直接爆炸???此刻,马尔科夫过程(Markov Processes)被推了出来:随机过程的每一步的结果与且仅与上一步有关,与其它无关。
makov过程用数学语言表述就是马尔可夫链(Markov chain)。马尔科夫链条中,随机过程的变化只取决于当下的变化而非历史,这种性质使得巨大的计算瞬时简化。
2 马尔可夫链 (Markov Chain)的具体例子
我们用一个具体现实中的例子来描述Markov Chain这样一个过程。假设进进他每天有三个状态:玩耍,学习,睡觉(这就是状态分布)。已知他今天在玩儿,那他明天学习、玩耍、睡觉的概率是多少?后天乃至N天后学习、玩耍、睡觉的概率是多少?
当然,想要知道N天后学习、玩耍、睡觉的概率是多少,我们需要有两个条件:
一个预知条件:知道进进第一天的状态(状态分布矩阵S),
一个假设:即我状态的转移都是有规律的,也就是今天学习,明天就玩儿或者睡觉或者还是继续学习的概率是确定的,简而言之,我们有预知确定的状态转移概率矩阵P。
上面这个矩阵就是确定的转移概率矩阵P,它是时间齐次性的,换句话说,也就是转移概率矩阵P它是保持不变的,第一天到第二天的转移概率矩阵跟第二天到第三天的转移概率矩阵是一样的。
有了这个转移概率矩阵P,再加上已知的第一天的状态分布矩阵(进进第一天在 玩 or 学 or 睡的概率),就可以计算出进进第N天的状态分布了(进进第N天在 玩 or 学 or 睡的概率)。
ok,我们现在已经拥有了测算进进n天后,是在玩还是在学,还是在睡的所有条件了,也就是初始状态分布矩阵S和转移概率矩阵P。假设进进第一天的状态分布矩阵 S1 = [0.3, 0.4, 0.3],里面的数字分别代表第一天这天进进在玩的概率,学的概率,和睡的概率。
那么
第二天进进玩学睡的状态分布矩阵 S2 = S1 * P (俩矩阵相乘)。
第三天进进玩学睡的状态分布矩阵 S3 = S2 * P (只和S2有关)。
第四天进进玩学睡的状态分布矩阵 S4 = S3 * P (只和S3有关)。
…
第n天进进玩学睡的状态分布矩阵 Sn = Sn-1 * P (只和Sn-1有关)。
可以看到:马尔可夫链就是这样一个任性的过程,它将来的状态分布只取决于现在,跟过去无关!这就是马尔科夫过程(Markov Processes)的体现,每天的进进可能的状态集合就构成了马尔可夫链(Markov chain)。
3 马尔可夫链的性质
以上面的例子继续深入,上面的例子中,初始状态分布矩阵S1 = [0.3, 0.4, 0.3],即第一天进进在玩的概率是30%,在学的概率是40%,在睡觉的概率是30%,我们以此来计算100天后,也就是第一百天进进在玩or学or睡觉的概率分布。
代码如下:
import numpy as npmatrix = np.matrix([[0.05, 0.75, 0.2],[0.8, 0.05, 0.15],[0.25, 0.5, 0.25]])
vector1 = np.matrix([[0.3, 0.4, 0.3]])for i in range(100):vector1 = vector1 * matrixprint('第{}轮'.format(i+1))print(vector1)
运行结果如下:
...
第96轮
[[0.39781591 0.41341654 0.18876755]]
第97轮
[[0.39781591 0.41341654 0.18876755]]
第98轮
[[0.39781591 0.41341654 0.18876755]]
第99轮
[[0.39781591 0.41341654 0.18876755]]
第100轮
[[0.39781591 0.41341654 0.18876755]]
从结果可以发现,已知一天初始状态和转移矩阵往后测算,当测算到某一天开始,往后的状态概率分布就不变了,一直保持[0.39781591, 0.41341654, 0.18876755]。这会不会是巧合?假如初始状态分布矩阵S1 不是 [0.3, 0.4, 0.3],结果还会是[0.39781591, 0.41341654, 0.18876755]吗?我们进行第二次试验,这次试验中,我们将始状态分布矩阵S1 = [0.2, 0.6, 0.2]。
代码如下:
import numpy as npmatrix = np.matrix([[0.05, 0.75, 0.2],[0.8, 0.05, 0.15],[0.25, 0.5, 0.25]])
vector1 = np.matrix([[0.2, 0.6, 0.2]])for i in range(100):vector1 = vector1 * matrixprint('第{}轮'.format(i+1))print(vector1)
运行结果:
...
第96轮
[[0.39781591 0.41341654 0.18876755]]
第97轮
[[0.39781591 0.41341654 0.18876755]]
第98轮
[[0.39781591 0.41341654 0.18876755]]
第99轮
[[0.39781591 0.41341654 0.18876755]]
第100轮
[[0.39781591 0.41341654 0.18876755]]
奇妙的事情发生了!在不同的初始概率分布下,最终状态的概率分布趋于同一个稳定的概率分布 [0.39781591, 0.41341654, 0.18876755]。
由此我们得到一个非常重要的性质:马尔可夫链模型的状态转移矩阵收敛到的稳定概率分布与初始状态概率分布无关。也就是说,在上面的那个例子中的初试状态矩阵,可以用任意的概率分布样本开始,只要马尔可夫链模型的状态转移矩阵确知,在一定规模的转换之后,我们就可以得到符合对应稳定概率分布的样本。
现在我们可以用数学语言总结下马尔科夫链的收敛性质了:
如果一个非周期的马尔科夫链有状态转移矩阵P, 并且它的任何两个状态是连通的,那么limn→∞pijn\text{lim}_{\text{n} \rightarrow \infty } p^{n}_{ij}limn→∞pijn与i无关,我们有:
limn→∞pijn=π(j)\text{lim}_{\text{n} \rightarrow \infty } p^{n}_{ij}=\pi \left( j\right) limn→∞pijn=π(j)
limn→∞pn=[π(1)π(2)...π(j)...π(1)π(2)...π(j)..................π(1)π(2)...π(j)..................]\lim_{n\rightarrow \infty } p^{n}=\begin{bmatrix}\pi \left( 1\right) &\pi \left( 2\right) &...&\pi \left( j\right) &...\\ \pi \left( 1\right) &\pi \left( 2\right) &...&\pi \left( j\right) &...\\ ...&...&...&...&...\\ \pi \left( 1\right) &\pi \left( 2\right) &...&\pi \left( j\right) &...\\ ...&...&...&...&...\end{bmatrix} n→∞limpn=⎣⎢⎢⎢⎢⎡π(1)π(1)...π(1)...π(2)π(2)...π(2)..................π(j)π(j)...π(j)..................⎦⎥⎥⎥⎥⎤
limn→∞pijn=π(j)\text{lim}_{\text{n} \rightarrow \infty } p^{n}_{ij}=\pi \left( j\right) limn→∞pijn=π(j)
π是方程πP = P的唯一非负解,其中: π=[π(1),π(2),...,π(j),...]∑i=0∞π(i)=1\pi =\left[ \pi \left( 1\right) ,\pi \left( 2\right) ,...,\pi \left( j\right) ,...\right] \ \sum^{\infty }_{i=0} \pi \left( i\right) =1 π=[π(1),π(2),...,π(j),...] i=0∑∞π(i)=1
上面的性质中需要解释的有:
非周期的马尔科夫链:这个主要指马尔科夫链的状态转化不是循环的,如果是循环的则永远不会收敛。幸运的是我们遇到的马尔科夫链一般都是非周期性的。用数学方式表述则是:对于任意某一状态i,d为集合{n∣n≥1,pijn>0}\left\{ n|n\geq 1,p^{n}_{ij}>0\right\} {n∣n≥1,pijn>0} 的最大公约数,如果
写给小白看的马尔科夫链(Markov Chain)最佳入门教程相关推荐
- 马尔可夫 java_马尔可夫过程(以马尔科夫链Markov为例)
马尔可夫过程(以马尔科夫链Markov为例) 马尔可夫过程 马尔可夫过程的大概意思就是未来只与现在有关,与过去无关. 简单理解就是渣男只在乎下一刻会不会爱你只取决于这一时刻对你的新鲜感,而与你之前对这 ...
- 13张动图助你彻底看懂马尔科夫链、PCA和条件概率!
来源:新智元 本文共2100字,建议阅读9分钟. 本文用可视化的方式来解释抽象的理论概念,使这些抽象概念变得生动而立体! [ 导读 ]马尔科夫链.主成分分析以及条件概率等概念,是计算机学生必学的知识点 ...
- 马尔科夫链Markov以及空间Markov Matlab代码
翻阅众多帖子没有一个帖子给出来,正确的清晰地马尔科夫链代码,实属悲哀. 本人在发表上一篇论文中用到了 普通马尔科夫链,顺便有偿分享一下代码,属实辛苦工作. 现代码可以计算四区间(论文中最常用的 低 ...
- python 马尔科夫链_用Python入门不明觉厉的马尔可夫链蒙特卡罗(附案例代码)...
大数据文摘作品 编译:Niki.张南星.Shan LIU.Aileen 这篇文章让小白也能读懂什么是人们常说的Markov Chain Monte Carlo. 在过去几个月里,我在数据科学的世界里反 ...
- MCMC学习笔记-马尔科夫链概述
参考文章:MCMC(二)马尔科夫链 - 刘建平Pinard - 博客园 写给小白看的马尔科夫链(Markov Chain)最佳入门教程_许进进的博客-CSDN博客_markov链 目录 1.马尔科夫链 ...
- 【强化学习】MOVE37-Introduction(导论)/马尔科夫链/马尔科夫决策过程
写在前面的话:从今日起,我会边跟着硅谷大牛Siraj的MOVE 37系列课程学习Reinforcement Learning(强化学习算法),边更新这个系列.课程包含视频和文字,课堂笔记会按视频为单位 ...
- 清晰易懂的马尔科夫链原理介绍
马尔科夫链是一种非常常见且相对简单的统计随机过程,从文本生成到金融建模,它们在许多不同领域都得到了应用.马尔科夫链在概念上非常直观且易于实现,因为它们不需要使用任何高级的数学概念,是一种概率建模和数据 ...
- NLP 《马尔科夫链》
定义:是一个离散的随机过程,状态的变化都是依赖于状态转移矩阵,用来描述状态空间中经过从一个状态到另一个状态的转换的随机过程,用图的形式表示如下,下图是截图别人的. 马尔科夫链是基于两个假设: 有限视野 ...
- 马尔科夫链原理简介及应用
马尔科夫链原理简介及应用 0 评论 马尔科夫链作为解释复杂时间进程的一个简单概念,在语音识别.文本标识.路径辨识等众多人工智能领域有广泛应用.本文对离散马尔科夫链的基本原理即应用做简要介绍. 马尔可夫 ...
- 马尔科夫链预测,Python实现
–记录自己学习的步伐,点滴的生活,以后学习和复习使用.纯手打,代码不抄袭.– 来源百度百科,具体定义和性质可以查看百度百科的内容.马尔科夫链 或者看一下下面的这个文章,也是翻译转载过来的.偷渡一下:[ ...
最新文章
- 嵌入式s5vp210裸机 KXTF9-2050(G-sensor)
- java核心技术读书笔记1
- 单元测试Struts2的Action(包含源码)
- tcp连接多久会自动断开_苹果M1 Mac用户报告蓝牙连接问题:外设经常会断开
- SAP UI5 CRM Reuse Fiori应用 note.js代码审查结果
- python怎么设置代码执行时间_python 代码运行时间获取方式详解
- iso镜像添加软件包_超薄Docker容器-减少Docker镜像大小的指南
- 0429《与孩子一起学编程》读书笔记1
- 修改命令有趣的Linux命令
- css的position属性取值
- 从源码角度彻底理解ReentrantLock(重入锁)
- java定时器频率自定义_@Scheduled 定时器 cron表达式自定义配置
- 11(3)-AirSim+四旋翼仿真-AirSim中人工势场法方法改进
- 群晖服务器显示灯,【群晖 DS119j 单盘位NAS 网络存储服务器使用总结】功能|配置|机身|指示灯_摘要频道_什么值得买...
- 2022,我们追逐群星,也在追逐AIGC的无尽可能
- 如何关闭windows杀毒软件
- (翻译)设计人员应去除正文中的孤行内容的原因
- ROS下dobot(magician)机械臂的python demo
- Java代码转换成伪代码生成器_将一段java程序片段改成算法伪代码
- 解决node-gyp报错:KeyError 2017
热门文章
- 马尔可夫 java_马尔可夫过程(以马尔科夫链Markov为例)