前向算法的数学意义上的实现
首先是前向算法
前向算法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)
前向算法文件:fwd.m
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 matrix 10 %pi=initial probability matrix 11 %输出: 12 %P=probability of given sequence in the given model 13 %% 预先分配变量空间,赋值 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 end 22 23 for t=1:(T-1) %(2)递推 24 for j=1:N 25 sum=0; 26 for i=1:N 27 sum=sum+a(i,j)*alpha(t,i); 28 end 29 alpha(t+1,j)=sum*b(j,o(t+1)); %% 对应(10.16) 30 end 31 end 32 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.3000 11 0.3000 0.5000 0.2000 12 0.2000 0.3000 0.5000 13 14 15 B = 16 17 0.5000 0.5000 18 0.4000 0.6000 19 0.7000 0.3000 20 21 22 O = 23 24 1 2 1 25 26 27 p = 28 29 0.1302 30 31 >> fwd_demo 32 33 pi = 34 35 0.2000 0.4000 0.4000 36 37 38 A = 39 40 0.5000 0.2000 0.3000 41 0.3000 0.5000 0.2000 42 0.2000 0.3000 0.5000 43 44 45 B = 46 47 0.5000 0.5000 48 0.4000 0.6000 49 0.7000 0.3000 50 51 52 O = 53 54 1 2 1 55 56 57 p = 58 59 0.130218000000000