MATLAB计算转移矩阵源代码

如何用MATLAB计算转移矩阵

如何用MATLAB计算马尔科夫矩阵

如何用MATLAB实现马尔科夫过程

这些都是一样的问题。

一. 转移矩阵算法描述

简书没有公式编辑器,敲在 Word 里,直接扔截图。

《MATLAB计算转移矩阵源代码》 转移矩阵的算法描述

二. 引例

引例来源:引例

1. 例子

《MATLAB计算转移矩阵源代码》 引例数据

2. 解法

1)数据处理与分析

将数据在 Excel 中处理成以下形式。把你的数据元素变成”某种意义的比值“,分析确定你的模型中”状态数“和所谓”相同状态年份间隔数“。本例中状态数为5,年份间隔数为5。每一个年份间隔都会输出一个转移概率矩阵,所以本例结果会输出 5 个 P。

《MATLAB计算转移矩阵源代码》 数据整理

2)输入info矩阵

此处有技巧,无需手工单个数据录入。先在 MATLAB 中输入info=[];,然后将 Excel 中整理好的数据全选复制,将光标移动到方括号中间,粘贴后按回车即可。

《MATLAB计算转移矩阵源代码》 输入info矩阵后MATLAB的窗口

3)修改代码

按照代码中注释修改部分参数。

%--此时你已经输入比例矩阵info

%--参数修改

P = zeros(5);       %所求转移矩阵阶数,本例中为5。
for k = 1:5         %k为年份间隔数,本例中为5。
    for i = 1:5     %i为状态数,本例中为5。

%--此处参数修改结束,后面还有一处修改

%--以下内容无需改动--%
      front = 0;
      back = 0;
      
      if (i ~= 1) %对应(2)(3)
      
        up = info(k+1,i);
        
        if(info(k+1,1)>info(k,1))
        
          for n = 2:i
            front = front + info(k,n);
          end
          for n = 2:i-1
            back = back + info(k+1,n);
          end
        
          down = front - back;
          P(i,i) = up / down;
          
        elseif(info(k+1,1)<info(k,1))
        
          for n = 1:i
            front = front + info(k,n);
          end
          for n = 1:i-1
            back = back + info(k+1,n);
          end
        
          down = front - back;
          P(i,i) = up / down;
          
        end
 %--无需改动结束--%
 
 %--bug修复--% 
 %--注意!注意!注意!--%
 %--在计算5阶这种小的转移矩阵还没什么问题,计算20阶时出现元素为负的情况,显然不合常理--%
 %--此时需要进行bug修复,将以下三行代码前注释符%去掉即可。会大幅影响计算结果!--%      
 %--也许是我的代码逻辑有问题,如果你发现了,请指正,不胜感激--%

 %       if(P(i,i)>1)
 %         P(i,i)= 1;
 %       end
 
 %--bug修复结束--%
 
 %--对应(5)--%       
        if(i == 5) %i为状态数,本例中为5
          P(i,1) = 1 - P(i,i);
        else 
          P(i,i+1) = 1 - P(i,i);
        end
      
      elseif (info(k+1,i)>info(k,i))
          P(i,i) = 1;

%--对应(1)-%        
      else
        
        up = info(k+1,i);
        down = info(k,i);
        P(i,i) = up / down;
        P(i,i+1) = 1 - P(i,i);
      end
  
  end

P

end

3)输入代码

代码在 Windows 10,MATLAB 2014a 环境下测试通过,可以输出状态转移矩阵 P。

《MATLAB计算转移矩阵源代码》 粘贴代码
《MATLAB计算转移矩阵源代码》 输出结果

4)其他

输出多个转移概率矩阵 P ,可以求一下均值当作接下来预测用的转移概率矩阵,嫌麻烦直接从几个 P 里挑一个好看的进行预测。

关于代码准确性,我算了以下五个 P 的均值,和引力来源中的论文比较了下,误差在小数点四位后。

《MATLAB计算转移矩阵源代码》 代码求得P均值
《MATLAB计算转移矩阵源代码》 引例给的结果

三. 写在后面

把论文写成教程的既视感有没有…

在建模搜索资料的过程中发现,关于 MATLAB 在马尔科夫过程中特别是转移矩阵的计算中,无论使用 Google 还是百度,都搜不到现成的代码。也许这些代码对大牛来说随手写,但写完不分享令我等渣渣深感困扰,只好花了一晚上来自己写。代码的质量很差,但又不是不能用,斜眼笑。有错误和不足欢迎在评论区指正,谢谢。原理在引例链接中的论文有详细说明,可以点进去仔细看看。代码不会用也可以在评论区说。

点赞