首先是前向算法
前向算法demo文件:fwd_demo.m
1 %% 前向算法的demo 2 %% 验证的例子参见《统计学习方法》p177 3 %% 4 5 % (编码:红1,白2) 6 % 初始概率分布 7 pi=[0.2 0.4 0.4] 8 9 % 概率转移矩阵10 A=[ 0.5 0.2 0.3;11 0.3 0.5 0.2;12 0.2 0.3 0.5]13 14 % 观察矩阵(发射矩阵)15 B=[ 0.5 0.5;16 0.4 0.6;17 0.7 0.3]18 19 % 观察序列20 O=[1,2,1]21 22 %%调用前向算法fwd(~)23 %% 24 format long %% 为了尽量显示全小数部分25 p=fwd(O,A,B,pi)
1 function p=fwd(o,a,b,pi) 2 %% 参考:《统计学习方法》李航 p174 3 % 暂时不使用向量化编程~ 4 %% 5 %函数功能:一阶离散单观察序列HMM的前向算法(数学意义) 6 %输入: 7 %O=Given observation sequence labellebd in numerics 8 %A(N,N)=transition probability matrix 9 %B(N,M)=Emission matrix10 %pi=initial probability matrix11 %输出:12 %P=probability of given sequence in the given model13 %% 预先分配变量空间,赋值14 N=length(a(1,:)); %% N=隐状态数15 T=length(o); %% T序列长度,也是时间~16 alpha=zeros(T,N);17 18 %前向算法主体19 for i=1:N %(1)初值20 alpha(1,i)=b(i,o(1))*pi(i); %% 对应(10.15)21 end22 23 for t=1:(T-1) %(2)递推24 for j=1:N25 sum=0;26 for i=1:N27 sum=sum+a(i,j)*alpha(t,i);28 end29 alpha(t+1,j)=sum*b(j,o(t+1)); %% 对应(10.16)30 end31 end32 p=0;33 for i=1:N %(3)终止34 p=p+alpha(T,i); %% 对应(10.17)35 end
运行后的结果:
1 >> fwd_demo 2 3 pi = 4 5 0.2000 0.4000 0.4000 6 7 8 A = 9 10 0.5000 0.2000 0.300011 0.3000 0.5000 0.200012 0.2000 0.3000 0.500013 14 15 B =16 17 0.5000 0.500018 0.4000 0.600019 0.7000 0.300020 21 22 O =23 24 1 2 125 26 27 p =28 29 0.130230 31 >> fwd_demo32 33 pi =34 35 0.2000 0.4000 0.400036 37 38 A =39 40 0.5000 0.2000 0.300041 0.3000 0.5000 0.200042 0.2000 0.3000 0.500043 44 45 B =46 47 0.5000 0.500048 0.4000 0.600049 0.7000 0.300050 51 52 O =53 54 1 2 155 56 57 p =58 59 0.130218000000000