【算法学习】马尔可夫过程及经典例题讲解(含代码实现)

article/2025/8/21 13:09:28

公众号关注 52DATA ,获得更多数据分析知识,感谢支持—>

文章目录

    • 马尔可夫过程
      • 1. 马尔可夫性
      • 2. 马尔可夫链
        • 2.1 转移概率矩阵(随机矩阵)
        • 2.2 状态概率
        • 2.3 平稳分布
      • 3.一个很经典的例题帮助理解马尔科夫预测方法
        • 1.求状态转移概率
        • 2.运用状态概率进行预测
        • 3.准备使用1950-1979年的数据来预测1979-1989的数据

马尔可夫过程

马尔可夫过程(Markov process)是一类随机过程。它的原始模型马尔可夫链,由俄国数学家A.A.马尔可夫于1907年提出。马尔可夫过程是研究离散事件动态系统状态空间的重要方法,它的数学基础是随机过程理论。

N阶马尔可夫过程:每个状态依赖于前N个状态
1阶马尔可夫过程:最简单的马尔可夫过程,只与前一个状态有关

1. 马尔可夫性

系统的下一个状态S(t+1)仅仅与当前状态S(t)有关,与之前状态无关

公式表示
在这里插入图片描述

此性质称为马尔可夫性,亦称无后效性或无记忆性

若随机过程在这里插入图片描述

满足马尔可夫性,则称为马尔可夫过程

当然 二阶马尔科夫就是:系统的下一个状态S(t+1)仅仅与前两个状态有关S(t),S(t-1)
三阶马尔科夫就是:系统的下一个状态S(t+1)仅仅与前三个状态有关S(t),S(t-1),S(t-2)

2. 马尔可夫链

2.1 转移概率矩阵(随机矩阵)

若马尔可夫链在时刻 ( t − 1 ) 处于状态 j,在时刻 t移动到状态 i,将转移概率记作
在这里插入图片描述

其中
在这里插入图片描述

则可以构成马尔可夫链的转移概率矩阵
在这里插入图片描述

例如
在这里插入图片描述

这个马尔科夫链是表示股市模型的,共有三种状态:牛市(Bull market), 熊市(Bear market)和横盘(Stagnant market)。每一个状态都以一定的概率转化到下一个状态。比如,牛市(Bull market)以0.025的概率转化到横盘(Stagnant market)的状态。这个状态概率转化图可以以矩阵的形式表示。如果我们定义矩阵阵P某一位置P(i,j)的值为P(j|i),即从状态i转化到状态j的概率,并定义牛市为状态0, 熊市为状态1, 横盘为状态2. 这样我们得到了马尔科夫链模型的状态转移矩阵为
在这里插入图片描述

每一行的值为1,一个状态向外的状态的概率之和1

2.2 状态概率

考虑马尔可夫链在这里插入图片描述
在时刻t的概率分布,称为时刻 t 的状态分布 或 状态向量 (state vector)或 状态概率,记作

在这里插入图片描述

其中,
在这里插入图片描述

通常初始分布 π(0) 的向量只有一个分量是1,其余分量都是0,表示马尔可夫链从一个具体状态开始

马尔可夫链 X在时刻t的状态分布,可以由在时刻(t−1) 的状态分布以及转移概率分布决定
在这里插入图片描述

递推可得
在这里插入图片描述

在这里插入图片描述

上式说明,马尔可夫链的状态分布由初始分布和转移概率分布决定

2.3 平稳分布

若干个时间步后收敛于平稳分布
在这里插入图片描述

3.一个很经典的例题帮助理解马尔科夫预测方法

有一张某地区农业收成变化表,有三个状态,即“丰收”、“平收”和“欠收”。记E1为“丰收”状态,E2为“平收”状态,E3为“欠收”状态,如下表:
在这里插入图片描述

1.求状态转移概率

补充知识,条件概率
在这里插入图片描述

在15个从E1出发(转移出去)的状态转移中,有3个是从E1转移到E1的(即1→2,24→25,34→35),有7个是从E1转移到E2的(即2→3,9→10,12→13,15→16,29→30,35→36,39→40),有5个是从E1转移到E3的(即6→7,17→18,20→21,25→26,31→32)

P11=P(E1->E1)=P(E1|E1)=3/15 0.2
P12=P(E1->E2)=P(E1|E2)=7/15 0.4666666666666667
P13=P(E1->E3)=P(E1|E3)=5/15 0.3333333333333333

同理求出:
P21=P(E2->E1)=P(E2|E1)=7/13= 0.5384615384615384
P22=P(E2->E2)=P(E2|E2)=2/13= 0.15384615384615385
P23=P(E2->E3)=P(E2|E3)=4/13= 0.3076923076923077
P31=P(E3->E1)=P(E3|E1)=4/11= 0.36363636363636365
P32=P(E3->E2)=P(E3|E2)=5/11= 0.45454545454545453
P33=P(E3->E3)=P(E3|E3)=2/11= 0.18181818181818182

所以,该地区农业收成变化的状态转移概率矩阵为(保留三位小数)

在这里插入图片描述

2.运用状态概率进行预测

基本原理见上方
如果将1989年的农业收成状态记为π(0)=[0,1,0](因为1989年处于“平收”状态),
带入
在这里插入图片描述

就可以求得1990—2007年可能出现的各种状态的概率
1990年状态概率为[0.53846154 0.15384615 0.30769231]
1991年状态概率为[0.30242066 0.41481083 0.28276851]
1992年状态概率为[0.38666872 0.33347783 0.27985344]
1993年状态概率为[0.35866362 0.3589558 0.28238058]
1994年状态概率为[0.36770046 0.35095514 0.2813444 ]
1995年状态概率为[0.36482299 0.35347047 0.28170654]
1996年状态概率为[0.36573359 0.35267923 0.28158718]
1997年状态概率为[0.36544626 0.35292819 0.28162555]
1998年状态概率为[0.3655368 0.35284985 0.28161335]
1999年状态概率为[0.36550829 0.3528745 0.28161721]
2000年状态概率为[0.36551726 0.35286674 0.28161599]
2001年状态概率为[0.36551444 0.35286918 0.28161638]
2002年状态概率为[0.36551533 0.35286842 0.28161626]
2003年状态概率为[0.36551505 0.35286866 0.2816163 ]
2004年状态概率为[0.36551514 0.35286858 0.28161628]
2005年状态概率为[0.36551511 0.35286861 0.28161629]
2006年状态概率为[0.36551512 0.3528686 0.28161629]
2007年状态概率为[0.36551511 0.3528686 0.28161629]
2008年状态概率为[0.36551511 0.3528686 0.28161629]
2009年状态概率为[0.36551511 0.3528686 0.28161629]

可以看到从2007年开始,状态概率就达到平衡了,经过无穷多次状态转移后所得到的状态概率称为终极状态概率,或称平衡状态概率。

数学表示:存在平衡状态概率一个 π,使得π=πP ,则 π 是平衡状态概率。

在这里插入图片描述

在这里插入图片描述

求解π1,π2,π3即可

平衡状态概率是用来预测马尔可夫过程在遥远的未来会出现什么趋势的重要信息。

3.准备使用1950-1979年的数据来预测1979-1989的数据

直接上代码

#1950--1979年数据
data=["E1","E1","E2","E3","E2","E1","E3","E2","E1","E2",
"E3","E1","E2","E3","E1","E2","E1","E3","E3","E1",
"E3","E3","E2","E1","E1","E3","E2","E2","E1","E2",
]#1979-1989年数据
data1=["E1","E3","E2","E1","E1","E2","E2","E3","E1","E2"]E1data=[]#计算从E1开始的状态
for i in range(len(data)-1):if data[i]=="E1":E1data.append(data[i+1])
E2data=[]#计算从E2开始的状态
for i in range(len(data)-1):if data[i]=="E2":E2data.append(data[i+1])E3data=[]#计算从E3开始的状态
for i in range(len(data)-1):if data[i]=="E3":E3data.append(data[i+1])E1E1=0#E1->E1个数
E1E2=0#E1->E2个数
E1E3=0#E1->E3个数
for i in range(len(E1data)):if E1data[i]=="E1":E1E1=E1E1+1if E1data[i]=="E2":E1E2=E1E2+1if E1data[i]=="E3":E1E3=E1E3+1p11=E1E1/len(E1data)
p12=E1E2/len(E1data)
p13=E1E3/len(E1data)
print("p11=",p11)
print("p12=",p12)
print("p13=",p13)E2E1=0#E2->E1个数
E2E2=0#E2->E2个数
E2E3=0#E2->E3个数
for i in range(len(E2data)):if E2data[i]=="E1":E2E1=E2E1+1if E2data[i]=="E2":E2E2=E2E2+1if E2data[i]=="E3":E2E3=E2E3+1p21=E2E1/len(E2data)
p22=E2E2/len(E2data)
p23=E2E3/len(E2data)
print("p21=",p21)
print("p22=",p22)
print("p23=",p23)E3E1=0#E3>E1个数
E3E2=0#E3->E2个数
E3E3=0#E3->E3个数
for i in range(len(E3data)):if E3data[i]=="E1":E3E1=E3E1+1if E3data[i]=="E2":E3E2=E3E2+1if E3data[i]=="E3":E3E3=E3E3+1p31=E3E1/len(E3data)
p32=E3E2/len(E3data)
p33=E3E3/len(E3data)
print("p31=",p31)
print("p32=",p32)
print("p33=",p33)import numpy as np
P=np.array([[p11,p12,p13],[p21,p22,p23],[p31,p32,p33]])
#注意numpy的数字是int32  会截取数据
P#状态转移概率# 因为1979年的状态是E2,所以假设pai1979=[0,1,0]
pai1979=np.array([0,1,0])
pai1980=pai1979.dot(P)pai1980
#可以看出1980的E1概率比较大 array([0.55555556, 0.11111111, 0.33333333])pai1981=pai1980.dot(P)
pai1981
#可以看出1981的E2概率比较大,但与事实相反 array([0.27384961, 0.41301908, 0.31313131])pai=np.array([0,1,0])
for i in range(10):pai=pai.dot(P)print("%s年=%s,预测状态为E%s"%(1980+i,pai,list(pai).index(max(list(pai) ))+1))
1980=[0.55555556 0.11111111 0.33333333],预测状态为E1
1981=[0.27384961 0.41301908 0.31313131],预测状态为E2
1982=[0.38362299 0.30953758 0.30683944],预测状态为E1
1983=[0.34399477 0.34514023 0.310865  ],预测状态为E2
1984=[0.35791074 0.33287239 0.30921686],预测状态为E1
1985=[0.35307608 0.33710224 0.30982168],预测状态为E1
1986=[0.35474857 0.33564346 0.30960798],预测状态为E1
1987=[0.35417099 0.33614661 0.3096824 ],预测状态为E1
1988=[0.35437031 0.33597306 0.30965663],预测状态为E1
1989=[0.35430154 0.33603292 0.30966554],预测状态为E1
#1979-1989年数据
data1=["E1","E3","E2","E1","E1","E2","E2","E3","E1","E2"]#预测的结果
yucedata=["E1","E2","E1","E2","E1","E1","E1","E1","E1","E1"]
xt=0#相同个数for i in range(len(data1)):if data1[i]==yucedata[i]:xt=xt+1
xt/len(data1)  #正确率只有0.3的准确率(数据量太小)

公众号关注 52DATA ,获得更多数据分析知识,感谢支持—>


http://chatgpt.dhexx.cn/article/yKIVykyZ.shtml

相关文章

数学基础(8)-- 马尔可夫链与马尔可夫过程

目录 1. 简介 1.1 定义 1.2 变种 2. 瞬态演变 3. 马尔科夫链性质 3.1 可还原性 3.2 周期性 3.3 重现性 4. 有限状态空间 1. 简介 马尔可夫链(英语:Markov chain),又称离散时间马可夫链(discrete-time Markov…

部分可观测马尔可夫过程POMDP

POMDP与MDP的一句话区别:POMDP的state具有不确定性,由七元数组定义,多了观测空间、观测函数、初始置信(belief),根据观测概率矩阵求出最可能是的状态 利用值迭代法解决POMDP问题 MDP POMDP 状态→动作 信…

马尔可夫 java_马尔可夫过程(以马尔科夫链Markov为例)

马尔可夫过程(以马尔科夫链Markov为例) 马尔可夫过程 马尔可夫过程的大概意思就是未来只与现在有关,与过去无关。 简单理解就是渣男只在乎下一刻会不会爱你只取决于这一时刻对你的新鲜感,而与你之前对这段感情的付出毫无关系。 设有一个随机过程X(t)&…

马尔可夫决策过程

马尔可夫决策过程 一、马尔科夫决策过程:**马尔科夫决策过程****最优决策**值迭代策略迭代MDP中的参数估计 二、代码实战:A、马尔可夫决策过程值迭代B、马尔可夫决策过程策略迭代C、马尔可夫决策过程动态规划版 参考文章 本文介绍了马尔可夫决策过程&…

随机过程第2讲——马尔可夫过程的应用

温习:随机过程第1讲——泊松过程的模拟与检验:https://blog.csdn.net/ChenQihome9/article/details/82871332 去得也突然——不知在什么时候,雨,悄悄地停了。风也屏住了呼吸,山中一下变得非常幽静。远处,一…

强化学习(2): 马尔可夫过程

前言 本文重点介绍MDP,因为MDP是目前最适合表征强化学习问题的模型。 一个具体的赌徒例子,来说明强化学习的算法如何与MDP构建联系,并且求解出最优策略。链接如下:link 一、马尔可夫性 其假设未来的状态仅取决与当前的状态。过…

贝叶斯网络、马尔可夫模型、马尔可夫过程、马尔可夫链、马尔可夫网络基本概念

知识储备与简要概括 可数集【Countable set】: 是指每个元素都能与自然数集N的每个元素之间能建立一一对应的集合。如果将可数集的每个元素标上与它对应的那个自然数记号,那么可数集的元素就可以按自然数的顺序排成一个无穷序列a1,a2&#…

强化学习笔记:马尔可夫过程 马尔可夫奖励过程

1 马尔可夫性质 (Markov Property) 我们设状态的历史为(包含了之前的所有状态) 如果一个状态转移是符合马尔可夫性质的,也就是满足如下条件: 也就是说,从当前状态转移到状态的概率,就…

马尔可夫性质、马尔可夫链和马尔可夫过程

关注:灰质,有趣有料的AI技术分享 前言 研究决策问题就一定听说过马尔可夫过程(Markov Process),这是一类非常重要的方法。现在非常热门的强化学习都是基于马尔可夫过程方法建立的。马尔可夫决策过程是研究随机序贯决策…

1.3 马尔可夫过程

之前介绍的奖励、智能体、动作、观察和环境可以看成RL的一级概念。以此为基础,我们将探索RL的二级概念,包括状态(state)、事件(episode)、历史(history)、价值(value&…

一文看懂马尔科夫过程

1.马尔科夫决策过程(MDPs)简介 马尔科夫决策过程是对强化学习(RL)问题的数学描述。几乎所有的RL问题都能通过MDPs来描述: 最优控制问题可以用MDPs来描述;部分观测环境可以转化成POMDPs;赌博机问题是只有一个状态的MDPs;注:虽然大部分DL问题都能转化为MDPs,但是以下所描述…

马尔可夫Markov决策过程 MDP、马尔可夫奖励过程MRP

引言 在概率论及统计学中,马尔可夫过程(英语:Markov process)是一个具备了马尔可夫性质的随机过程,因为俄国数学家安德雷马尔可夫得名。马尔可夫过程是不具备记忆特质的(memorylessness)。换言…

零基础学习python数据分析,需要掌握哪些技能?

对于刚刚入行的小白同学来说,在学习python的过程中,一定会遇到一些疑问。比如说: 学习Python需要多久? 学习Python需要达到什么样的程度? 学Python的书籍有哪些? 为了处理数据集,我需要精通…

Python数据分析期末复习归纳

python数据分析期末复习归纳(更新中) 文章目录 python数据分析期末复习归纳(更新中)前言一、python语言基础二、内建数据结构、函数、文件(重点)元组列表内建序列函数字典函数 三、Numpy基础(重…

Python数据分析师特训营84节

刚看完了小破站的一个数据分析的课程: “2020年Python数据分析师特训营全套84节视频完结版(就业向/零基础友好)” 趁着热乎劲儿,想记录一下课程讲到的关于python的基础知识,还有numpy、pandas、matplotlib(数据分析三大利器)工具…

Python数据分析:混淆矩阵

【小白从小学Python、C、Java】 【Python全国计算机等级考试】 【Python数据分析考试必会题】 ● 标题与摘要 Python数据分析 混淆矩阵 ● 选择题 以下关于混淆矩阵说法错误的是: A TP是被正确分类的正例个数 B FN是被错误分类的正例个数 C 主对角元素是不同类别样例…

Python数据分析和处理

数据的维度 从一个数据到一组数据:一个数据表达一个含义,一组数据表达一个或多个含义 维度:一组数据的组织形式 一维数据:由对等关系的有序或无序数据构成。采用线性方式组织 二维数据:由多个一维数据组成,是一维数…

Python数据分析之理论知识

文章目录 Python数据分析概述一、数据分析的概念1.广义数据分析2.数据挖掘 二、数据分析流程1. 需求分析:2. 数据获取3.数据预处理4.分析与建模5.模型评价与优化6. 分类模型评价指标7.回归模型8.部署 三、数据分析应用场景四、总思维导图 Python数据分析概述 一、数…

如何用Python进行数据分析,详细流程讲解!

1:为什么选择Python进行数据分析? Python是一门动态的、面向对象的脚本语言,同时也是一门简约,通俗易懂的编程语言。Python入门简单,代码可读性强,一段好的Python代码,阅读起来像是在读一篇外语文章。Pyt…

如何用Python进行数据分析?

本文为CDA数据分析研究院原创作品,转载需授权 1.为什么选择Python进行数据分析? Python是一门动态的、面向对象的脚本语言,同时也是一门简约,通俗易懂的编程语言。Python入门简单,代码可读性强,一段好的Python代码,阅读起来像是在读一篇外语文章。Python这种特性称为“伪…