当前位置:   article > 正文

数学建模常用算法—马尔可夫预测_马尔可夫算法

马尔可夫算法

今天数模君带大家学习一下数学建模中的预测算法之马尔科夫预测。

目录

模型的含义

实例分析


模型的含义

马尔可夫(Markov)预测法,就是一种关于事件发生的概率预测方法。它是根据事件的目前状况来预测其将来各个时刻(或时期)变动状况的一种预测方法。马尔可夫预测法是地理预测研究中重要的预测方法之一。

1. 状态

指某一件事在某个时刻(或时期)出现的某种结果。

2.状态转移过程

事件的发展,从一种状态转变为另一种状态,称为状态转移。

3.马尔可夫过程

在事件的发展过程中,若每次状态的转移都仅与前一时刻的状态有关,而与过去的状态无关,或者说状态转移过程是无后效性的,则这样的状态转移过程就称为马尔可夫过程。

4.状态转移概率

用于描述,在事件的发展变化过程中,从某一种状态出发,在下一时刻转移到其它状态的可能性大小。

为了求出每一个,一般采用频率近似概率的思想进行计算。

5.状态转移概率矩阵

假定某一个事件的发展过程有n个可能的状态,即E1,E2,…,En。记为从状态Ei转变为状态Ej的状态转移概率

则矩阵

实例分析

题1:考虑某地区农业收成变化的3个状态,即“丰收”、“平收”和“歉收”。记E1为“丰收”状态,E2为“平收”状态,E3为“歉收”状态。表给出了该地区1975—2014年期间农业收成的状态变化情况。试计算该地区农业收成变化的状态转移概率矩阵。

 将例题1中2014年的农业收成状态记为 =[0,1, 0] (因为2014年处于“平收”状态),将状态转移概率矩阵代入递推公式,求2015—2025年可能出现的各种状态的概率。

  1. > library(markovchain)
  2. > library(readxl)
  3. > library(tidyverse)
  4. > library(expm)
  5. > library(diagram)
  6. > setwd("D:/code")
  7. > tb456=read_xlsx('markov.xlsx') %>%
  8. + mutate(state1=lag(state))
  9. > #交叉统计,变量state1转为state的个数
  10. > tss= table(tb456[-1,]$state1,tb456[-1,]$state)
  11. > #返回交叉表的频率,即状态转移概率矩阵
  12. > tmA=prop.table(tss,1)
  13. > tmA
  1. E1 E2 E3
  2. E1 0.2000000 0.4666667 0.3333333
  3. E2 0.5384615 0.1538462 0.3076923
  4. E3 0.3636364 0.4545455 0.1818182
  1. > #可视化
  2. > plotmat(tmA,pos = c(1,2),
  3. + lwd = 1, box.lwd = 2,
  4. + cex.txt = 0.8,
  5. + box.size = 0.1,
  6. + box.type = "circle",
  7. + box.prop = 0.5,
  8. + box.col = "light blue",
  9. + arr.length=.1,
  10. + arr.width=.1,
  11. + self.cex = .6,
  12. + self.shifty = -.01,
  13. + self.shiftx = .15,
  14. + main = "Markov Chain")

 

  1. > #初始状态
  2. > inital=matrix(c(0,1,0),nrow=1, byrow=TRUE)
  3. > #预测下一年
  4. > fc15=inital %*% tmA
  5. > #预测下两年
  6. > fc16=inital %*% tmA%*% tmA
  7. > #预测第三年,tmA%^% 3相当于tmA%*% tmA%*%tmA
  8. > fc17=inital %*% (tmA%^% 3)
  9. > #要进行多年预测,因此编写一个函数
  10. > myfunction=function(n){
  11. + inital %*% (tmA%^% n)
  12. + }
  13. > mats=matrix(data = NA,nrow = 11,ncol = 3) %>%
  14. + data.frame()
  15. > #预测2015-2025年,共11年,用一个dataframe来进行结果存储
  16. > for (i in 1:11) {
  17. + mats[i,]=myfunction(i)
  18. + }
  19. > mats$year=seq(2015,2025)
  20. > colnames(mats)=c('E1','E2',"E3",'year')
  21. > mats
  1. E1 E2 E3 year
  2. 1 0.5384615 0.1538462 0.3076923 2015
  3. 2 0.3024207 0.4148108 0.2827685 2016
  4. 3 0.3866687 0.3334778 0.2798534 2017
  5. 4 0.3586636 0.3589558 0.2823806 2018
  6. 5 0.3677005 0.3509551 0.2813444 2019
  7. 6 0.3648230 0.3534705 0.2817065 2020
  8. 7 0.3657336 0.3526792 0.2815872 2021
  9. 8 0.3654463 0.3529282 0.2816256 2022
  10. 9 0.3655368 0.3528498 0.2816134 2023
  11. 10 0.3655083 0.3528745 0.2816172 2024
  12. 11 0.3655173 0.3528667 0.2816160 2025
  1. > #-------利用markovchain包中的函数快速实现-------------
  2. > #返回概率转移矩阵
  3. > Ma=createSequenceMatrix(tb456$state,toRowProbs = T)
  4. > #定义一个markov对象
  5. > dtmcA <- new("markovchain",transitionMatrix=Ma,
  6. + states=c('E1','E2',"E3"),
  7. + name="MarkovChain A")
  8. > #可视化
  9. > plot(dtmcA)

 

  1. > #定义一个dataframe存储结果,结果与mats相同
  2. > mats1=matrix(data = NA,nrow = 11,ncol = 3) %>%
  3. + data.frame()
  4. >
  5. > for (i in 1:11) {
  6. + mats1[i,]=inital*(dtmcA^i)
  7. + }
  8. > #终极状态概率
  9. > steadyStates(dtmcA)

最终结果:

  1. E1 E2 E3
  2. [1,] 0.3655151 0.3528686 0.2816163
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/380332
推荐阅读
相关标签
  

闽ICP备14008679号