MATLAB计算转移矩阵源代码

作者: zormin | 来源:发表于2016-08-29 12:35 被阅读1636次

    如何用MATLAB计算转移矩阵

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

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

    这些都是一样的问题。

    一. 转移矩阵算法描述

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

    转移矩阵的算法描述

    二. 引例

    引例来源:引例

    1. 例子

    引例数据

    2. 解法

    1)数据处理与分析

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

    数据整理

    2)输入info矩阵

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

    输入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。

    粘贴代码 输出结果

    4)其他

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

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

    代码求得P均值 引例给的结果

    三. 写在后面

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

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

    相关文章

      网友评论

        本文标题:MATLAB计算转移矩阵源代码

        本文链接:https://www.haomeiwen.com/subject/vqvxettx.html