码迷,mamicode.com
首页 > 编程语言 > 详细

前向算法的数学意义上的实现

时间:2015-10-09 22:34:53      阅读:302      评论:0      收藏:0      [点我收藏+]

标签:

首先是前向算法

前向算法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.1521 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.1630     end
31 end
32 p=0;
33 for i=1:N         %(3)终止
34     p=p+alpha(T,i);        %% 对应(10.1735 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

 

前向算法的数学意义上的实现

标签:

原文地址:http://www.cnblogs.com/LzKlyhPorter/p/4865242.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!