马尔科夫链(Markov Chain, MC)算法详解及Python实现

简介: 马尔科夫链(Markov Chain, MC)算法详解及Python实现

前言


博主参与八次数学建模大赛,其实数学建模和大数据分析有很多相似之处,可以说差不多是共通的。经历了这么多次比赛个人总结一些建模必备的数据分析方法是必须要完全掌握。在人类发展的历史上,马尔可夫链是第一个从理论上被提出并加以研究的随机过程模型。在我以前的机器学习模型学习研究中,马尔可夫链算法可算是用途最广泛的算法之一了。现代生活可以说的上是基本都蕴含着马尔科夫链基础算法原理所在,要理解马尔科夫链算法原理并不难,但是衍生思想和优化思想却很难让人考虑到。特别是基于现在大数据时代,海量数据统计下概率匹配是相当恐怖的,使用马尔科夫衍生算法能够渗透到很多方面。本篇文章将详细讲述马尔科夫链基本算法原理和使用案例。


理论比较难以一下明白,但是通过例子就好理解了。这里我们采用倒叙方法先从一个简单的案例入手,再到解释原理:


一、目标案例


我们拿一个场景的地铁拥堵系数来进行分析:


1.需求


我周一到周五都需要坐地铁上班,但是经常会发生地铁拥堵的情况,我把地铁拥堵系数设置为三个可选参数(1,2,3)。1代表地铁很拥堵,人挤人,体验感很差都不想坐地铁了。2代表地铁还行,虽然挤但是还算的过去。3代表通畅,地铁里面都没什么人来坐,随随便便就能找到个座位。那么我前一个小时坐地铁的情况都记录了下来,如何判断我将来一个小时的地铁拥堵情况呢?


面对这种情况我们并没有像传统的机器学习算法可用的特征,能够在强关联特征时序或者前后顺序下预测出后一个标签,那么马尔科夫模型就很适用。


2.依赖


要想开展马尔科夫算法需要两个依赖条件:


第一我们要清楚前一个小时中,我们了解到站一个站台为5分钟,这里我们需要根据上一个站的情况,统计并计算后一个站拥堵系数情况的状态发生概率,由于我们这里有三种拥堵系数状态,故为一个一维矩阵:[0.3,0.4,0.3].该矩阵我们称之为(状态分布矩阵S)


第二个站台之间是具有强关联性质的,也就是说路过了上一个站台那么下一个站台发生拥堵的可能性是具有一定的规律性的,有一定的概率可以统计得出。


比如我们这里设置:


当前一个站台拥堵系数为1时,后一个站台拥堵系数为1的概率为0.6,为2的概率为0.2,为3的概率为0.2.


当前一个站台拥堵系数为2时,后一个站台拥堵系数为1的概率为0.5,为2的概率为0.2,为3的概率为0.3


当前一个站台拥堵系数为3时,后一个站台拥堵系数为1的概率为0.2,为2的概率为0.4,为3的概率为0.4


这里我们可以构建一个矩阵:


前一个站台拥堵系数概率\后一个站台拥堵系数概率 1 2 3
1 0.6 0.2 0.2
2 0.5 0.2 0.3
3 0.2 0.4 0.4


而我们构建的这个矩阵就是转移概率矩阵P它是时间齐次性的,也就是说转移概率矩阵P它是保持不变的,前一站台到后一站台的转移概率矩阵跟后一站台到再后一站台的转移概率矩阵是一样的。


3.计算


有了这个转移概率矩阵P,再加上已知的第一天的状态分布矩阵,就可以计算出N天后的状态分布了。


站台状态分布矩阵 计算公式
S2 S1*P
S3 S2*P
S4 S3*P

Sn

Sn-1*P


以上来看马尔科夫链算法预测出来的过程只取决与现在。当然和历史数据存在间接关系。


4.Python模拟

import numpy as np
matrix = np.matrix([[0.6, 0.2, 0.2],
                    [0.5, 0.2, 0.3],
                    [0.2, 0.4, 0.4]])
vector1 = np.matrix([[0.3, 0.4, 0.3]])
for i in range(50):
    vector1 = vector1 * matrix
    print('第{}轮'.format(i+1))
    print(vector1)

我们会发现最后几站的概率会逐渐的收敛为一个固定的概率矩阵。

第44轮
[[0.46153846 0.25641026 0.28205128]]
第45轮
[[0.46153846 0.25641026 0.28205128]]
第46轮
[[0.46153846 0.25641026 0.28205128]]
第47轮
[[0.46153846 0.25641026 0.28205128]]
第48轮
[[0.46153846 0.25641026 0.28205128]]
第49轮
[[0.46153846 0.25641026 0.28205128]]
第50轮
[[0.46153846 0.25641026 0.28205128]]

此时我们修改初始第一个站台的拥堵系数的概率

import numpy as np
matrix = np.matrix([[0.6, 0.2, 0.2],
                    [0.5, 0.2, 0.3],
                    [0.2, 0.4, 0.4]])
vector1 = np.matrix([[0.6, 0.2, 0.2]])
for i in range(50):
    vector1 = vector1 * matrix
    print('第{}轮'.format(i+1))
    print(vector1)
第45轮
[[0.46153846 0.25641026 0.28205128]]
第46轮
[[0.46153846 0.25641026 0.28205128]]
第47轮
[[0.46153846 0.25641026 0.28205128]]
第48轮
[[0.46153846 0.25641026 0.28205128]]
第49轮
[[0.46153846 0.25641026 0.28205128]]
第50轮
[[0.46153846 0.25641026 0.28205128]]

由此我们得到一个非常重要的性质:马尔可夫链模型的状态转移矩阵收敛到的稳定概率分布与初始状态概率分布无关。


bf9c5a02a40c4a8f3b0ab84eeef67aed.jpg



看完上述案例后我们再由理论过一遍理解的更加透彻


二、马尔科夫链


  马尔可夫链(Markov Chain, MC)是概率论和数理统计中具有马尔科夫性质(Markov property)且存在于离散的指数集(index set)和状态空间(state space)内的随机过程(stochastic process)。适用于连续指数集的马尔可夫链被称为马尔科夫过程(Markov process),但有时也被视为马尔可夫链的子集,即连续时间马尔科夫链(Continuous-Time MC, CTMC),与离散时间马尔可夫链(Discrete-Time MC, DTMC)相对应,因此马尔可夫链是一个较为宽泛的概念。


       马尔可夫链可通过转移矩阵和转移图定义,除马尔可夫性外,马尔可夫链可能具有不可约性、常返性、周期性和遍历性。一个不可约和正常返的马尔可夫链是严格平稳的马尔可夫链,拥有唯一的平稳分布。遍历马尔可夫链(ergodic MC)的极限分布收敛于其平稳分布。


       马尔可夫链可被应用于蒙特卡洛方法中,形成马尔可夫链蒙特卡罗(Markov Chain Monte Carlo, MCMC) ,也被用于动力系统、化学反应、排队论、市场行为和信息检索的数学建模。此外作为结构最简单的马尔科夫模型(Markov model),一些机器学习算法,例如隐马尔科夫模型(Hidden Markov Model, HMM)、马尔科夫随机场(Markov Random Field, MRF)和马尔科夫决策过程(Markov decision process, MDP)以马尔可夫链为理论基础。


二、马尔科夫性质


马尔可夫性质是概率论中的一个概念,因为俄国数学家安德雷·马尔可夫得名。当一个随机过程在给定现在状态及所有过去状态情况下,其未来状态的条件概率分布仅依赖于当前状态;换句话说,在给定现在状态时,它与过去状态(即该过程的历史路径)是条件独立的,那么此随机过程即具有马尔可夫性质。具有马尔可夫性质的过程通常称之为马尔科夫过程。


马尔可夫链中随机变量的状态随时间步的变化被称为演变(evolution)或转移(transition)。这里介绍描述马尔可夫链结构的两种途径,即转移矩阵和转移图,并定义了马尔可夫链在转移过程中表现出的性质。


马尔可夫链中随机变量间的条件概率可定义为如下形式的(单步)转移概率和n-步转移概率


c95ebc3aa74a448698de2c28a3aed8df.png


式中下标i_{n}表示第n 步的转移。由马尔可夫性质可知,在给定初始概率gif.gif后,转移概率的连续乘法可以表示马尔科夫链的有限维分布(finite-dimensional distribution)


4d876fc9263d48c59d650a01cd305b53.png


式中的c89257ce860844d9bbd11411216df44f.png

为样本轨道(sample path),即马尔可夫链每步的取值。对n-步转移概率,由Chapman–Kolmogorov等式可知,其值为所有样本轨道的总和:


60d7b964833746539f58f3cd38093e6e.png


上式表明,马尔可夫链直接演变n步等价于其先演变n-k步,再演变k步(k处于该马尔可夫链的状态空间内)。n-步转移概率与初始概率的乘积被称为该状态的绝对概率。

若一个马尔可夫链的状态空间是有限的,则可在单步演变中将所有状态的转移概率按矩阵排列,得到转移矩阵


c14716b1a8314bdfa17210919b57ee79.png



马尔可夫链的转移矩阵是右随机矩阵(right stochastic matrix),矩阵的第gif.gif行表示时,gif.gif


取所有可能状态的概率(离散分布),因此马尔可夫链完全决定转移矩阵,转移矩阵也完全决定马尔可夫链  。由概率分布的性质可得,转移矩阵是一个正定矩阵,且每行元素之和等于1:

466ba6de9cd04c10aa4362704a28a65e.png

按相同的方式也可定义n-步转移矩阵3154fafd70f54d26a266c601eee64aaf.png由n-步转移概率的性质(Chapman–Kolmogorov等式)可知,n-步转移矩阵是其之前所有转移矩阵的连续矩阵乘法:

b941f19286194d57a4338a848bce9b32.png

这里对马尔可夫链的4个性质:不可约性、常返性、周期性和遍历性进行定义。与马尔可夫性质不同,这些性质不是马尔可夫链必然拥有的性质,而是其在转移过程中对其状态表现出的性质。上述性质都是排他的,即不具有可约性的马尔可夫链必然是不可约的,以此类推。


1.不可约性(irreducibility)


如果一个马尔可夫链的状态空间仅有一个连通类,即状态空间的全体成员,则该马尔可夫链是不可约的,否则马尔可夫链具有可约性(reducibility) 。马尔可夫链的不可约性意味着在其演变过程中,随机变量可以在任意状态间转移。


2.常返性(recurrence)


若马尔可夫链在到达一个状态后,在演变中能反复回到该状态,则该状态是常返状态,或该马尔可夫链具有(局部)常返性,反之则具有瞬变性(transience)的。正式地,对状态空间中的某个状态,马尔可夫链对一给定状态的返回时间(return time)是其所有可能返回时间的下确界(infimum):


b9400fc8daf843d2a32c4784acd27254.png

17769a9b30024f6793477fc2effefd06.png则该状态不存在瞬变性或常返性;493aca8ac547491f850fa3c7434b2ac4.png则该状态的瞬变性和常返性的判断准则如下:

9fa14d79381d4171baa0c2e5e9e41143.png


在时间步趋于无穷时,常返状态的返回概率(return probability)的和,即总访问次数的期望也趋于无穷:


e16211b62897460e973674ad58f7fa01.png


此外,若状态dff137995c894ae18696b9c9019a57dd.png具有常返性,则可计算其平均返回时间(mean recurrence time):b5afab25694643b98809278d76235cb5.png

若平均返回时间90b1f8e0067b478189a9d2254574a78a.png该状态是“正常返的(positive recurrent)”,否则为“零常返的(null recurrent)”。若一个状态是零常返的,那意味着马尔可夫链两次访问该状态的时间间隔的期望是正无穷。


3.周期性(periodicity)

个正常返的马尔可夫链可能具有周期性,即在其演变中,马尔可夫链能够按大于1的周期常返其状态。正式地,给定具有正常返的状态76ac1b0f9d67455bb4cc324e1b531993.png,其返回周期按如下方式计算:


80ebee7c018d437a931ffd6896cf44d1.png

4.遍历性(ergodicity)


若马尔可夫链的一个状态是正常返的和非周期的,则该状态具有遍历性 。若一个马尔可夫链是不可还原的,且有某个状态是遍历的,则该马尔可夫链的所有状态都是遍历的,被称为遍历链。由上述定义,遍历性有如下推论:


推论:若状态A是吸收态,且A是状态B的可达状态,则A是遍历的,B不是遍历的。


推论:若多个状态的马尔可夫链包含吸收态,则该马尔可夫链不是遍历链。


推论:若多个状态的马尔可夫链形成有向无环图,或单个闭环,则该马尔可夫链不是遍历链。


遍历链是非周期的平稳马尔可夫链,有长时间尺度下的稳态行为,因此是被广泛研究和应用的马尔可夫链。

目录
相关文章
|
19天前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
212 55
|
7天前
|
存储 缓存 监控
局域网屏幕监控系统中的Python数据结构与算法实现
局域网屏幕监控系统用于实时捕获和监控局域网内多台设备的屏幕内容。本文介绍了一种基于Python双端队列(Deque)实现的滑动窗口数据缓存机制,以处理连续的屏幕帧数据流。通过固定长度的窗口,高效增删数据,确保低延迟显示和存储。该算法适用于数据压缩、异常检测等场景,保证系统在高负载下稳定运行。 本文转载自:https://www.vipshare.com
102 66
|
2月前
|
搜索推荐 Python
利用Python内置函数实现的冒泡排序算法
在上述代码中,`bubble_sort` 函数接受一个列表 `arr` 作为输入。通过两层循环,外层循环控制排序的轮数,内层循环用于比较相邻的元素并进行交换。如果前一个元素大于后一个元素,就将它们交换位置。
139 67
|
2月前
|
存储 搜索推荐 Python
用 Python 实现快速排序算法。
快速排序的平均时间复杂度为$O(nlogn)$,空间复杂度为$O(logn)$。它在大多数情况下表现良好,但在某些特殊情况下可能会退化为最坏情况,时间复杂度为$O(n^2)$。你可以根据实际需求对代码进行调整和修改,或者尝试使用其他优化策略来提高快速排序的性能
128 61
|
2月前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
118 63
|
29天前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
155 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
11天前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
49 20
|
4天前
|
算法 网络协议 Python
探秘Win11共享文件夹之Python网络通信算法实现
本文探讨了Win11共享文件夹背后的网络通信算法,重点介绍基于TCP的文件传输机制,并提供Python代码示例。Win11共享文件夹利用SMB协议实现局域网内的文件共享,通过TCP协议确保文件传输的完整性和可靠性。服务器端监听客户端连接请求,接收文件请求并分块发送文件内容;客户端则连接服务器、接收数据并保存为本地文件。文中通过Python代码详细展示了这一过程,帮助读者理解并优化文件共享系统。
|
9天前
|
存储 算法 Python
文件管理系统中基于 Python 语言的二叉树查找算法探秘
在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
41 5
|
2月前
|
存储 算法 搜索推荐
Python 中数据结构和算法的关系
数据结构是算法的载体,算法是对数据结构的操作和运用。它们共同构成了计算机程序的核心,对于提高程序的质量和性能具有至关重要的作用