如何用MATLAB计算转移矩阵
如何用MATLAB计算马尔科夫矩阵
如何用MATLAB实现马尔科夫过程
这些都是一样的问题。
一. 转移矩阵算法描述
简书没有公式编辑器,敲在 Word 里,直接扔截图。
转移矩阵的算法描述二. 引例
引例来源:引例
1. 例子
引例数据2. 解法
1)数据处理与分析
将数据在 Excel 中处理成以下形式。把你的数据元素变成”某种意义的比值“,分析确定你的模型中”状态数“和所谓”相同状态年份间隔数“。本例中状态数为5,年份间隔数为5。每一个年份间隔都会输出一个转移概率矩阵,所以本例结果会输出 5 个 P。
数据整理2)输入info矩阵
此处有技巧,无需手工单个数据录入。先在 MATLAB 中输入info=[];
,然后将 Excel 中整理好的数据全选复制,将光标移动到方括号中间,粘贴后按回车即可。
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 还是百度,都搜不到现成的代码。也许这些代码对大牛来说随手写,但写完不分享令我等渣渣深感困扰,只好花了一晚上来自己写。代码的质量很差,但又不是不能用,斜眼笑。有错误和不足欢迎在评论区指正,谢谢。原理在引例链接中的论文有详细说明,可以点进去仔细看看。代码不会用也可以在评论区说。
网友评论