% ①定义一个HMM并训练这个HMM。
6 f1 E0 f) e- F1 T% ②用一组观察值测试这个HMM,计算该组观察值域HMM的匹配度。
% n# Z! T, a. s: h, ?% 修改:旺齐齐
2 _* n1 o' C$ y+ R0 q! ?8 o7 s- `% 修改部分为:添加 HMM2 模型。测试一个观察序列更加符合哪个哪个HMM模型。4 G% F( v& {9 J" W) v1 T* U9 ~
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % O:观察状态数
. z/ V; @. V8 v' DO = 7;" I* T9 T7 i" u$ K1 j
O2 = 7;( O( {5 n. D$ D* `% E& D
% Q:HMM状态数8 W7 a* t ^- T$ }
Q = 5;$ m$ g8 _. F& N7 _
Q2 = 5;
; I9 k3 m& W0 E6 s. j0 i%训练的数据集,每一行数据就是一组训练的观察值
; r* Y, _- R0 _: U6 r9 tdata=[1,2,3,1,2,2,4,2,3,1,2,7,2;
1 r9 C, ~5 }8 o q) i 1,2,3,6,2,2,1,4,3,1,5,3,1;
: [- P( U- m2 F8 B 1,2,3,1,2,5,1,2,4,1,2,3,2;6 R3 X r6 W Y5 j- D: t
1,2,7,1,2,2,1,2,5,1,2,4,1;
7 n. F5 ^. D, M; Z4 _ 5,2,3,3,5,2,1,2,3,1,2,3,6;
. x& ]+ P% Z$ I7 C- `; C; g6 h 1,2,3,1,2,2,1,6,5,1,2,6,4;
5 i- y( i% r$ h7 F$ l4 c 5,2,3,4,4,2,1,2,3,1,2,5,6;
2 D$ n h- O- _0 W u4 j4 U 1,2,6,1,2,2,1,2,3,1,4,3,2;7 D: B- w- n3 S" _5 A$ t! ^7 B* H
1,2,3,4,2,7,1,4,3,1,7,3,3;8 \: o0 _4 f* P) X+ a
5,2,3,5,2,2,1,2,3,1,2,3,4;, E& _; Z6 ?9 ~/ F6 U0 n
5,2,4,1,2,2,5,2,3,7,1,6,2;]
' G' J) \' |& U9 S data2 = [1,2,3,1,2,2,4,2,3,1,2,7,2;5 M8 ]; ?9 z* x M' y
1,2,3,6,2,2,1,4,3,1,5,3,1;
y, _. l/ I1 d I" Z2 Q, K: C6 P9 J/ V 1,2,3,1,2,5,1,2,4,1,2,3,2;
3 j) ]. r8 n& ?) f0 C8 Y: |; a 1,2,7,1,2,2,1,2,5,1,2,4,1;
' G: t3 y5 {. ^7 L- ? 5,2,3,3,5,2,1,2,3,1,2,3,6;
4 S/ F5 @% A, ]; g 1,2,3,1,2,2,1,6,5,1,2,6,4;
7 n/ ]/ e" k3 @& ]0 Q5 d- n 5,2,3,4,4,2,1,2,3,1,2,5,6;4 K0 L% Q/ E& K- z
1,2,6,1,2,2,1,2,3,1,4,3,2;
! T+ j4 ^' r9 }8 j8 o% R. ], f 1,2,3,4,2,7,1,4,3,1,7,3,3;
# M. W9 A d7 y" l0 _4 V 5,2,3,5,2,2,1,2,3,1,2,3,4;' i) K/ H1 |7 M n
4,2,5,1,2,2,6,2,3,7,1,6,4;]
% initial guess of parameters
v+ v: n1 U/ w5 e% 初始化参数
$ o6 z$ p$ U4 \. N- c3 jprior1 = normalise(rand(Q,1));" K: ~7 V% {8 w6 D7 r+ u
transmat1 = mk_stochastic(rand(Q,Q));
' F) |! ?# }1 e- ~% r) a7 G4 j* S zobsmat1 = mk_stochastic(rand(Q,O)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
* y* S( O1 j k, }& [% 添加部分
2 r9 V6 W2 b* X. j' E prior3 = normalise(rand(Q2,1));
8 K# V- ^! |3 `# c f/ H8 o+ ]7 W! q transmat3 = mk_stochastic(rand(Q2,Q2));/ O) y1 K$ }5 K& r0 }" S( Y! [
obsmat3 = mk_stochastic(rand(Q2,O2));
& [ ~9 e( A5 `# }8 L) j* _8 k/ h' N%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % improve guess of parameters using EM D, Q5 P* ~0 W, _, D E
% 用data数据集训练参数矩阵形成新的HMM模型
9 R0 e$ u+ I# T8 K8 y" G[LL, prior2, transmat2, obsmat2] = dhmm_em(data, prior1, transmat1, obsmat1, 'max_iter', size(data,1));4 V- e O2 J4 ^' S5 e/ ]- B
% 训练后那行观察值与HMM匹配度 [6 {. T5 x9 Y! ] \) Z" i
LL; Z8 [0 q h, Z7 e
% 训练后的初始概率分布
& q( A z1 P/ |! V9 J. J0 @% Eprior2
2 T0 R A; r# A* x! B% _% 训练后的状态转移概率矩阵
5 V' U& D( ]6 ]transmat2
8 t5 Z' D8 i2 b1 h4 ^% 观察值概率矩阵: F% z; d/ D" Q5 f% y
obsmat2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%$ r; m4 X f. M2 _0 X) U
% 添加部分8 e) @" w+ d2 t
[LL2, prior4, transmat4, obsmat4] = dhmm_em(data2, prior3, transmat3, obsmat3, 'max_iter', size(data2,1));
0 M- p' P; u9 T2 { LL22 U, J. {! h% x3 e- w
prior4' \" p1 t( o& @7 G; d
transmat4' u) E3 k; M( X y" G u2 s
obsmat4. z5 B! N+ {- j7 V+ c |% z
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % use model to compute log likelihood7 k8 X& t# g( I2 a/ f0 \6 Q7 E
% data1=[1,2,3,1,2,2,1,2,3,1,2,3,1]/ D$ d1 X5 h- ] W5 ~5 j
data1 = [5,2,4,1,2,2,5,2,3,7,1,6,2]2 d! P% X( ]; `1 ]9 F+ }' N
loglik = dhmm_logprob(data1, prior2, transmat2, obsmat2)
; A' |. d( D+ ]% log lik is slightly different than LL(end), since it is computed after the final M step0 u, r$ v+ R( X0 Z0 {4 k2 n
% loglik 代表着data和这个hmm(三参数为prior2, transmat2, obsmat2)的匹配值,越大说明越匹配,0为极大值。 % path为viterbi算法的结果,即最大概率path %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
) t3 c$ E' F% I. j& t. T% 添加部分: w x$ [" U" R3 a& |, B7 {- s
loglik2 = dhmm_logprob(data1, prior4, transmat4, obsmat4)
: p8 e% g' [ S9 u%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
& |* d" D2 h7 G0 u5 W% Q2 yB = multinomial_prob(data1,obsmat2);
5 P/ n+ Y5 \' N! S$ zpath = viterbi_path(prior2, transmat2, B)" A+ G0 O: h' K* z0 D% l* y2 u
save('sa.mat');
; d) T+ q( Z7 P9 o4 K$ U7 d" y%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3 ?. P6 P9 `: j% 添加部分, r X6 r8 r2 M$ |$ `( u* L
B2 = multinomial_prob(data1,obsmat4);
; }7 M( e, m, v9 w! S path2 = viterbi_path(prior4, transmat4, B2)6 |2 K ` n: _2 Y! B5 h
save('sa2.mat');) m5 z) ?7 ]+ u$ @: P
if loglik2 > loglik + M9 _* z3 e( Q" \: K& D
fuhe = 2: p' u5 v( Y7 _
else. Y( E1 l& @* l
fuhe = 1
' U. H% Z3 {, U5 A' F8 ~ end
) U& W. z; _5 h$ E: Q+ G%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
------ 运行结果 ------ data = 1 2 3 1 2 2 4 2 3 1 2 7 2
! y s: P+ U1 X 1 2 3 6 2 2 1 4 3 1 5 3 10 W% w1 W5 S3 L6 w2 S3 s
1 2 3 1 2 5 1 2 4 1 2 3 2
% Y p# {) s& N, v+ F+ N 1 2 7 1 2 2 1 2 5 1 2 4 1
! q3 D* k1 d9 v" P 5 2 3 3 5 2 1 2 3 1 2 3 6
: R6 P# b- i( R3 h) N3 E! K. I 1 2 3 1 2 2 1 6 5 1 2 6 4
# u' C9 Z) a4 h& u8 F 5 2 3 4 4 2 1 2 3 1 2 5 6$ J6 A! H4 y i8 x1 l
1 2 6 1 2 2 1 2 3 1 4 3 2
( g3 V* }- R3 o7 w: j 1 2 3 4 2 7 1 4 3 1 7 3 33 @1 f: ^: b7 H7 a! G' W
5 2 3 5 2 2 1 2 3 1 2 3 4
z/ L2 `& c( r' ` 5 2 4 1 2 2 5 2 3 7 1 6 2 * z! g [# D% F, \: `* i* R
data2 = 1 2 3 1 2 2 4 2 3 1 2 7 2
; _" T) N% T d1 O 1 2 3 6 2 2 1 4 3 1 5 3 1
) d- I1 E! ~+ E% x 1 2 3 1 2 5 1 2 4 1 2 3 2. x/ l R) w" d
1 2 7 1 2 2 1 2 5 1 2 4 1, s% t2 X2 K6 W$ N9 r
5 2 3 3 5 2 1 2 3 1 2 3 6
+ [" D! V0 | g, o# n: V4 X. ? 1 2 3 1 2 2 1 6 5 1 2 6 4* X( R- l, ?' S% r3 o
5 2 3 4 4 2 1 2 3 1 2 5 68 h: h+ h" a2 k; V) Y$ W+ `5 r( V r
1 2 6 1 2 2 1 2 3 1 4 3 2
! U+ B) P9 j9 h4 v 1 2 3 4 2 7 1 4 3 1 7 3 3: B. F2 m/ t; {% D; `
5 2 3 5 2 2 1 2 3 1 2 3 4
) K+ S, Z |8 G7 }4 M 4 2 5 1 2 2 6 2 3 7 1 6 4 iteration 1, loglik = -327.100465
3 |- A/ j4 a( g9 t; Riteration 2, loglik = -238.259812
2 }( F& U" g) \ L& [( k/ ~iteration 3, loglik = -232.9629480 Y0 Q0 y3 L ~" n: X" q
iteration 4, loglik = -223.323891
/ L$ i1 z0 |- e: F$ qiteration 5, loglik = -207.630875
" Y- }% q _: U; [3 o* R% y2 riteration 6, loglik = -191.012697( Y% `2 ^& J$ X% o6 L
iteration 7, loglik = -178.611546# n$ Z% m' x. B
iteration 8, loglik = -171.524132
* ]. M& W; ^2 b/ ~& Y& Aiteration 9, loglik = -168.626526
3 T* n9 g, j& U- [ G* O1 ~' Niteration 10, loglik = -167.3870570 H- f+ S" Q. D
iteration 11, loglik = -166.689175 LL = Columns 1 through 9 -327.1005 -238.2598 -232.9629 -223.3239 -207.6309 -191.0127 -178.6115 -171.5241 -168.6265 Columns 10 through 11 -167.3871 -166.6892 # `* U, G3 C2 r2 {/ k8 `- Z* X
prior2 = 0.0000
" l, U; G" e. s" n1 K, u 0.0000) t3 D# {, z) F. s; O0 h3 u
1.0000
+ [3 Q/ l) R7 M& ] 0.0000
! i- K3 e! W6 X* V6 c$ ] z 0.0000 0 k" L% H* y: N5 G1 m
transmat2 = 0.0138 0.0089 0.7680 0.1060 0.1033
! a$ V* Z' P3 }4 r 0.7811 0.0000 0.0199 0.0067 0.19234 T( T* t2 ^4 k6 g' t6 T
0.0000 0.9936 0.0000 0.0064 0.0000
. l8 c$ ]3 c. D& X2 K! S8 \ 0.1686 0.2604 0.2242 0.3398 0.0070
8 r6 K+ a: _' U2 d# m P 0.0053 0.0406 0.8350 0.1184 0.0007
/ N9 n- z% x' f6 L6 ~$ Jobsmat2 =
0.0000 0.2351 0.5738 0.0256 0.1118 0.0186 0.0351
% d+ X% r( j8 v$ u 0.0000 0.8270 0.0000 0.0790 0.0256 0.0456 0.02281 C; `, I3 O0 u! y
0.7514 0.0021 0.0011 0.0550 0.1472 0.0432 0.0000
0 Z: r# o4 Z2 j% i 0.0014 0.4208 0.0447 0.4366 0.0023 0.0887 0.00555 i1 A) G7 s1 I0 \/ @0 t7 x& V
0.0000 0.0784 0.3223 0.2014 0.0116 0.1525 0.2338 iteration 1, loglik = -277.738670; G2 i" I1 w! T4 D3 [
iteration 2, loglik = -242.163247
3 q) t5 K' v9 Z( K5 @, _4 \& M7 @5 jiteration 3, loglik = -238.321971
0 l* U( }# h) g+ Q. _: U( diteration 4, loglik = -233.166746
& ]" `( f$ Y9 niteration 5, loglik = -225.682259
7 R& v6 {1 T/ |- |( m9 q$ [iteration 6, loglik = -214.5602968 F, z3 O% Q+ H
iteration 7, loglik = -201.1820154 q% Z% c/ h2 c
iteration 8, loglik = -189.427453
! H/ h: \8 R) C2 Uiteration 9, loglik = -179.156352
. ?6 S( ^( l5 E* Piteration 10, loglik = -171.744096; B p: d0 d/ I; V0 y0 ?
iteration 11, loglik = -168.409063 LL2 = Columns 1 through 9 -277.7387 -242.1632 -238.3220 -233.1667 -225.6823 -214.5603 -201.1820 -189.4275 -179.1564 Columns 10 through 11 -171.7441 -168.4091
: d7 ~4 Y' v* |4 `/ P/ ]7 t' W% @prior4 =
0.0000
1 X! A5 |7 ]' h5 j 0.99825 l) \( |* d2 g3 b7 g
0.0004! R U6 Z" B. r9 a
0.0014+ V8 T9 j4 K$ Q4 ?9 f) ^+ j. ^
0.0000
- t0 s. @$ X( t1 O/ I* Vtransmat4 =
0.0873 0.5277 0.2799 0.1007 0.00458 i j1 t! l: u5 x1 B! D1 i
0.0002 0.0000 0.0005 0.0000 0.9994
$ G) d* Z% l5 a, u- h, ^" n0 Y 0.0180 0.0000 0.0118 0.0011 0.96928 u1 V! ~' q5 a: d
0.0436 0.0226 0.0810 0.0219 0.8310
; ?$ M' e @( ^# V1 ~ 0.9746 0.0056 0.0003 0.0195 0.0000
" D8 e( q6 L% S$ }obsmat4 =
0.0000 0.2012 0.5080 0.0580 0.1093 0.0465 0.0770
' {: s3 O% ~* I4 Q" N' O5 e 0.7939 0.0001 0.0000 0.0745 0.1277 0.0038 0.0000
6 ?; [& l/ L9 n% W+ f 0.4120 0.1044 0.0049 0.1736 0.0032 0.3017 0.0001
. \% s' }5 R/ W4 k7 Y0 w: K6 F 0.4527 0.0622 0.0637 0.2568 0.0549 0.0295 0.0802
& m9 K6 v2 _% P* v6 o: F' K 0.0000 0.8172 0.0000 0.0943 0.0270 0.0389 0.0225 q& p. F1 _# U
data1 = 5 2 4 1 2 2 5 2 3 7 1 6 2 $ f6 I' B0 u. N
loglik = -19.2351 _9 ^0 A( x' |- j, _: v
loglik2 = -21.0715 / H2 V2 { I' U
path = 3 2 5 3 2 1 3 2 1 5 3 2 1
% A6 G. O# }) V3 n1 g" mpath2 =
2 5 1 2 5 1 2 5 1 1 2 5 1
# ~( p' V! N9 i) o! T) ufuhe =
1 |