马尔可夫链(Markov),是数学中具有马尔可夫性质的离散时间随机过程。该过程中,在给定当前知识或信息的情况下,过去(即当期以前的历史状态)对于预测将来(即当期以后的未来状态)是无关的。因此马尔可夫链有众多的生物学应用,特别是人口过程,可以帮助模拟生物人口过程的建模,还可用来建模排队理论和统计学中的建模。隐蔽马尔可夫模型还被用于生物信息学,用以编码区域或基因预测。
在MATLAB程序中,主要参见以下主要几步,
Step 1,求出各食品数据的增长率;
Step 2, 编程,使快速上升 (>0.03),在程序中用“2”表示;缓慢上升(0,0.03) ,在程序中用“1”表示;相对不变0 ,在程序中用“0”表示;缓慢下降(-0.03,0) ,在程序中用“-1”表示;快速下降(<-0.03) ,在程序中用“-2”表示.;得到各类食品在不同时期的B 。
Step 3,统计相邻增长率变化的一致的次数C ,例如:增长率为先快速增长后相对不变出现的次数为‘20’=1;
Step 4,对每一种食品,分五类进行叠加求和,分别为“先快速增长”、“先缓慢增长”、“先相对不变”、“先缓慢下降”、“先快速下降”;得到D 。
Step 5,求出一步转移概率矩阵E ;即 每行的每五个数据依次与对应的C 相除D,得到概率矩阵 E的一行;
Step 6, 使用求出的一步转移概率矩阵E ,并求出不同时期的状态概率;
- clc,clear,close all
- load('x.mat')
- for j=1:42
- fori=1:38
- a(j,i)=(x(j,i+1)-x(j,i))/x(j,i); % 求增长率
- end
- end
- b=zeros(42,38);
- c=zeros(42,25);
- % 分别为不同增长率赋值
- for j=1:42
- fori=1:38
- if a(j,i)>=0.03
- b(j,i)=2;
- elseif (a(j,i)<0.03)&&(a(j,i)>0)
- b(j,i)=1;
- elseif a(j,i)==0
- b(j,i)=0;
- elseif a(j,i)>-0.03 &&a(j,i)<0
- b(j,i)=-1;
- elseif a(j,i)<-0.03
- b(j,i)=-2;
- end
- end
- end
- % 统计相连增长率值特征
- for j=1:42
- for i=1:36
- if (b(j,i)==2&&b(j,i+1)==2)
- c(j,1)=c(j,1)+1;
- elseif(b(j,i)==2&&b(j,i+1)==1)
- c(j,2)=c(j,2)+1;
- elseif(b(j,i)==2&&b(j,i+1)==0)
- c(j,3)=c(j,3)+1;
- elseif(b(j,i)==2&&b(j,i+1)==-1)
- c(j,4)=c(j,4)+1;
- elseif(b(j,i)==2&&b(j,i+1)==-2)
- c(j,5)=c(j,5)+1;
- elseif(b(j,i)==1&&b(j,i+1)==2)
- c(j,6)=c(j,6)+1;
- elseif(b(j,i)==1&&b(j,i+1)==1)
- c(j,7)=c(j,7)+1;
- elseif(b(j,i)==1&&b(j,i+1)==0)
- c(j,8)=c(j,8)+1;
- elseif(b(j,i)==1&&b(j,i+1)==-1)
- c(j,9)=c(j,9)+1;
- elseif(b(j,i)==1&&b(j,i+1)==-2)
- c(j,10)=c(j,10)+1;
- elseif(b(j,i)==0&&b(j,i+1)==2)
- c(j,11)=c(j,11)+1;
- elseif(b(j,i)==0&&b(j,i+1)==1)
- c(j,12)=c(j,12)+1;
- elseif(b(j,i)==0&&b(j,i+1)==0)
- c(j,13)=c(j,13)+1;
- elseif(b(j,i)==0&&b(j,i+1)==-1)
- c(j,14)=c(j,14)+1;
- elseif(b(j,i)==0&&b(j,i+1)==-2)
- c(j,15)=c(j,15)+1;
- elseif(b(j,i)==-1&&b(j,i+1)==2)
- c(j,16)=c(j,16)+1;
- elseif(b(j,i)==-1&&b(j,i+1)==1)
- c(j,17)=c(j,17)+1;
- elseif(b(j,i)==-1&&b(j,i+1)==0)
- c(j,18)=c(j,18)+1;
- elseif(b(j,i)==-1&&b(j,i+1)==-1)
- c(j,19)=c(j,19)+1;
- elseif(b(j,i)==-1&&b(j,i+1)==-2)
- c(j,20)=c(j,20)+1;
- elseif(b(j,i)==-2&&b(j,i+1)==2)
- c(j,21)=c(j,21)+1;
- elseif(b(j,i)==-2&&b(j,i+1)==1)
- c(j,22)=c(j,22)+1;
- elseif(b(j,i)==-2&&b(j,i+1)==0)
- c(j,23)=c(j,23)+1;
- elseif(b(j,i)==-2&&b(j,i+1)==-1)
- c(j,24)=c(j,24)+1;
- elseif(b(j,i)==-2&&b(j,i+1)==-2)
- c(j,25)=c(j,25)+1;
- end
- end
- end
- d=zeros(42,5);
- % 累加求和
- for i=1:42
- forj=1:25
- if(j<6)
- d(i,1)=d(i,1)+c(i,j);
- elseif(j>5&&j<11)
- d(i,2)=d(i,2)+c(i,j);
- elseif(j>10&&j<16)
- d(i,3)=d(i,3)+c(i,j);
- elseif(j>15&&j<21)
- d(i,4)=d(i,4)+c(i,j);
- else
- d(i,5)=d(i,5)+c(i,j);
- end
- end
- end
复制代码
- %一步转移概率矩阵;
- f=b(:,37);
- e= zeros(5,5);
- for i=1:42
- forj=1:25
- if(j<6)
- if(d(i,1)==0)
- e(5,j)=0;
- else
- e(1,j)=c(i,j)/d(i,1);
- end
- elseif(j>5&&j<11)
- if(d(i,2)==0)
- e(5,j-5)=0;
- else
- e(2,j-5)=c(i,j)/d(i,2);
- end
- elseif(j>10&&j<16)
- if(d(i,3)==0)
- e(5,j-10)=0;
- else
- e(3,j-10)=c(i,j)/d(i,3);
- end
- elseif(j>15&&j<21)
- if(d(i,4)==0)
- e(5,j-15)=0;
- else
- e(4,j-15)=c(i,j)/d(i,4);
- end
- else
- if(d(i,5)==0)
- e(5,j-20)=0;
- else
- e(5,j-20)=c(i,j)/d(i,5);
- end
- end
- end
- g=zeros(i,5); %预测4、5月的增长率
- if(f(i,1)==2)
- h=[10 0 0 0 ]*e
- fork=1:6
- h=h*e
- end
- elseif(f(i,1)==1)
- g(i,:)=[0 1 0 0 0 ];
- h=g(i,:)*e
- fork=1:6
- h=h*e
- end
- elseif(f(i,1)==0)
- g(i,:)=[0 0 1 0 0 ];
- h=g(i,:)*e
- fork=1:6
- h=h*e
- end
- elseif(f(i,1)==-1)
- g(i,:)=[0 0 0 1 0 ];
- h=g(i,:)*e
- fork=1:6
- h=h*e
- end
- elseif(f(i,1)==-2)
- g(i,:)=[0 0 0 0 1 ];
- h=g(i,:)*e
- fork=1:6
- h=h*e
- end
- end
- end
复制代码
|