% ①定义一个HMM并训练这个HMM。
A1 n# { K" z% ②用一组观察值测试这个HMM,计算该组观察值域HMM的匹配度。
" h: o$ K# K$ z6 t( y) y Q% 修改:旺齐齐
# p/ |$ I& Z+ U$ v% 修改部分为:添加 HMM2 模型。测试一个观察序列更加符合哪个哪个HMM模型。 J, R; `! W* l. q
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % O:观察状态数. l8 Y! r8 {, a' }: {4 V
O = 7; e6 i6 |1 Y* u$ Y3 K) y
O2 = 7;. a9 i6 T: e9 ]" t+ Q
% Q:HMM状态数
" Z3 Q- g- A2 W) H' GQ = 5;4 _: Z: o Q @5 z( O( u
Q2 = 5;
$ o: V4 Z, X- ~6 P" U%训练的数据集,每一行数据就是一组训练的观察值
7 k- }, O" m! `0 mdata=[1,2,3,1,2,2,4,2,3,1,2,7,2;; R+ r& I- f, F
1,2,3,6,2,2,1,4,3,1,5,3,1;' d( C5 o; }+ P" z) {" J
1,2,3,1,2,5,1,2,4,1,2,3,2;# X" B. I: F- `( e
1,2,7,1,2,2,1,2,5,1,2,4,1;) ?) i! g7 C5 \) @9 n
5,2,3,3,5,2,1,2,3,1,2,3,6;
- U( j- X6 v8 [* f 1,2,3,1,2,2,1,6,5,1,2,6,4;" M4 `" ~1 W1 \; k
5,2,3,4,4,2,1,2,3,1,2,5,6;
1 [/ ]: W9 z( k6 E/ X/ n5 d: }; ~ 1,2,6,1,2,2,1,2,3,1,4,3,2;
8 H- u. I- A9 u$ c5 u9 u7 I 1,2,3,4,2,7,1,4,3,1,7,3,3;
! i0 K. q) Y3 a" _# n* r& u 5,2,3,5,2,2,1,2,3,1,2,3,4;' p3 N4 N1 w8 d, R; n U
5,2,4,1,2,2,5,2,3,7,1,6,2;]
* @8 \5 I$ |# s+ `. m; }4 B( z* x data2 = [1,2,3,1,2,2,4,2,3,1,2,7,2;
# y6 v0 t u; b# L% n$ ^' K9 t 1,2,3,6,2,2,1,4,3,1,5,3,1;4 a% v7 X; E- J0 V
1,2,3,1,2,5,1,2,4,1,2,3,2;3 \+ M3 S6 P2 r" n# T- ^
1,2,7,1,2,2,1,2,5,1,2,4,1;6 x0 X9 \* V M1 D' m7 g
5,2,3,3,5,2,1,2,3,1,2,3,6;
1 `, J# e+ K% H8 ` 1,2,3,1,2,2,1,6,5,1,2,6,4;
7 N2 `0 _% |: `* i, i- x& c6 M 5,2,3,4,4,2,1,2,3,1,2,5,6;: h' L4 s" { g0 e0 Z
1,2,6,1,2,2,1,2,3,1,4,3,2;
$ r" \; R3 D7 [% C( n! {+ U- _ 1,2,3,4,2,7,1,4,3,1,7,3,3;# {; }/ O5 M) y2 A0 P9 o' t8 P# r* A
5,2,3,5,2,2,1,2,3,1,2,3,4;6 V6 N1 O5 z3 }
4,2,5,1,2,2,6,2,3,7,1,6,4;]
% initial guess of parameters
: F& n* V2 U: m) Y. p" |% p% 初始化参数
2 ?6 u8 | f8 B1 qprior1 = normalise(rand(Q,1));" H0 S, o0 x0 y- Q( l1 x
transmat1 = mk_stochastic(rand(Q,Q));+ H) c$ L: n- Q* y4 X- N
obsmat1 = mk_stochastic(rand(Q,O)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9 j! a, D1 Z- q; n: _
% 添加部分% s( x$ v0 H% n5 i2 G- `
prior3 = normalise(rand(Q2,1));
; k2 p- m$ m7 `# ^ transmat3 = mk_stochastic(rand(Q2,Q2));
- w8 K0 R0 } m1 O6 I3 y obsmat3 = mk_stochastic(rand(Q2,O2));1 [3 b1 O& s9 Z& x
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % improve guess of parameters using EM* f/ z- W" X3 A7 ?& @
% 用data数据集训练参数矩阵形成新的HMM模型
7 E. ^9 s; Z h$ |[LL, prior2, transmat2, obsmat2] = dhmm_em(data, prior1, transmat1, obsmat1, 'max_iter', size(data,1)); E2 U$ C% q8 [" B, P: ~
% 训练后那行观察值与HMM匹配度4 P& b+ ^1 `" l L9 X
LL
: S/ T! k& H* a1 U% 训练后的初始概率分布/ ^) y8 f3 l7 _: Z% H! l G5 R
prior2
' V9 X6 E, A% X; `, P$ O% 训练后的状态转移概率矩阵
/ w; `! y) r) a, X& g6 A( @8 i# D! Gtransmat2& w( @% F2 w. `% j
% 观察值概率矩阵
}0 H. n9 A) E, p* U2 Jobsmat2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
* g& f3 P1 ^2 ?* {7 }% 添加部分 ]+ K* K: K/ P( i: F; k. t- H
[LL2, prior4, transmat4, obsmat4] = dhmm_em(data2, prior3, transmat3, obsmat3, 'max_iter', size(data2,1));
?, |- m- Y' `; [2 j3 n LL2
1 C( L4 y' _. e! ^. X prior4 s* D% F+ d. ?: H* R$ C" Z5 q
transmat4
' E7 l& k5 [ z) N" H8 v5 F obsmat4
/ d- e: C5 x2 d. V$ c%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % use model to compute log likelihood- K& G* Z# Y, O
% data1=[1,2,3,1,2,2,1,2,3,1,2,3,1]
7 A! W' c& [: a5 mdata1 = [5,2,4,1,2,2,5,2,3,7,1,6,2]
' c3 Z& Z3 |+ W! k: hloglik = dhmm_logprob(data1, prior2, transmat2, obsmat2)
3 I- g [- v& d! U$ J% log lik is slightly different than LL(end), since it is computed after the final M step8 G+ y, @% B% [- S/ x# F. G
% loglik 代表着data和这个hmm(三参数为prior2, transmat2, obsmat2)的匹配值,越大说明越匹配,0为极大值。 % path为viterbi算法的结果,即最大概率path %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
# c7 f7 ~, J3 A2 U% c- |2 r% 添加部分, ^0 P7 A' e- u# H- C# C
loglik2 = dhmm_logprob(data1, prior4, transmat4, obsmat4)+ ]0 M% G/ l4 c8 t: v% p" H
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3 f$ p' o& ]7 i2 l0 ^( k& VB = multinomial_prob(data1,obsmat2);
" W, w7 Z. v4 T* Q' U, Ipath = viterbi_path(prior2, transmat2, B)
9 e8 A8 `& q+ A( F4 W$ esave('sa.mat');
- s! q, z! O8 g' L3 F2 F%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
/ E; ]7 ?: |7 s! G4 e/ P) r* H% 添加部分
( v& \7 K' @$ y- [. v5 e& r: ` B2 = multinomial_prob(data1,obsmat4);: c1 h5 l( Y5 p6 M% P/ b4 ?
path2 = viterbi_path(prior4, transmat4, B2)( A. }3 q! q% J+ p/ z% c" }) p
save('sa2.mat');
7 O' e" K0 l o( ] if loglik2 > loglik + t, [3 c* _) n) t: C$ y
fuhe = 2" S4 r0 t. w' }. q
else) k% C) c A. v; N" ?# r* c' ~
fuhe = 1! Z4 [8 [7 Y% s$ [* }
end 2 w1 X H5 e1 Z% l5 i
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
------ 运行结果 ------ data = 1 2 3 1 2 2 4 2 3 1 2 7 22 x/ l+ ^- l, z7 [4 I! H
1 2 3 6 2 2 1 4 3 1 5 3 17 `; r' I" O& C
1 2 3 1 2 5 1 2 4 1 2 3 2
' O. e! C4 A9 S" t" J; [ 1 2 7 1 2 2 1 2 5 1 2 4 1# j0 f w$ Z9 U0 d% l$ R4 ~
5 2 3 3 5 2 1 2 3 1 2 3 6) ?8 W/ E7 w! V0 }
1 2 3 1 2 2 1 6 5 1 2 6 4: `" Q* x" u2 X1 R ~9 ~) K
5 2 3 4 4 2 1 2 3 1 2 5 6
8 y: b/ H# v9 Z& } 1 2 6 1 2 2 1 2 3 1 4 3 23 A: j' X% C! \ v7 o: l5 @& J
1 2 3 4 2 7 1 4 3 1 7 3 3
" y$ n4 A& n& c7 |! U 5 2 3 5 2 2 1 2 3 1 2 3 4
% ~# D+ ~2 T) T( _8 J5 Q' V+ Z 5 2 4 1 2 2 5 2 3 7 1 6 2
# u* h0 o" Y) Vdata2 =
1 2 3 1 2 2 4 2 3 1 2 7 2
* j; i' G* N+ \: d, q0 R 1 2 3 6 2 2 1 4 3 1 5 3 1
p/ }7 t5 B5 t$ Y 1 2 3 1 2 5 1 2 4 1 2 3 2
' i7 {$ e; {) }0 x# ]9 ? 1 2 7 1 2 2 1 2 5 1 2 4 1
A% l: Z) r$ Q5 |9 w 5 2 3 3 5 2 1 2 3 1 2 3 67 _6 C; j+ B) Q" ?3 z5 ?8 M# c
1 2 3 1 2 2 1 6 5 1 2 6 4: {9 p4 H9 W) h
5 2 3 4 4 2 1 2 3 1 2 5 63 O$ r [0 D0 a9 m7 U1 I
1 2 6 1 2 2 1 2 3 1 4 3 2
* K, l- y6 O0 P2 }4 { 1 2 3 4 2 7 1 4 3 1 7 3 3
( y4 I5 s: k. |1 K* p. I+ t( C 5 2 3 5 2 2 1 2 3 1 2 3 4
3 }6 z0 X3 f: O* Y& J 4 2 5 1 2 2 6 2 3 7 1 6 4 iteration 1, loglik = -327.100465
' B+ f; ~4 m+ c5 r8 z6 s' Viteration 2, loglik = -238.259812
# }( s0 x( t! V# e8 aiteration 3, loglik = -232.962948$ C7 K. ~% k& D2 E! g, R+ ]8 k& N
iteration 4, loglik = -223.323891
8 @) m$ E8 b/ L/ c' {: R& citeration 5, loglik = -207.630875
+ z& ]) k. y: i& [: d0 P+ V: j0 }iteration 6, loglik = -191.012697
6 T+ X% _3 c/ \! h: B. viteration 7, loglik = -178.611546* f! t& X/ h$ I- _' S% R
iteration 8, loglik = -171.524132# J9 j* ]; H& \2 s
iteration 9, loglik = -168.6265266 a& \' f& S% h* G- D0 K6 n) e
iteration 10, loglik = -167.387057
5 @7 z$ i$ m- D" E5 e2 Yiteration 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
v: i; a$ ?- C Hprior2 =
0.0000$ Q+ Y2 `2 T& Y3 k: Y+ b' z7 x
0.00003 z7 |1 ?( _7 ?* ] Y- m
1.0000& P/ Z% n* j7 U0 w$ L, L' a! J" \% \
0.0000
7 Z& ~& v& z. w- ^ 0.0000
3 p3 i' f; ^4 L' P* h/ y, w b+ Qtransmat2 =
0.0138 0.0089 0.7680 0.1060 0.1033. U2 C, b4 Z5 Y4 {. P
0.7811 0.0000 0.0199 0.0067 0.1923
' e3 e4 [3 }! Y) B* Y1 J. g9 ~ 0.0000 0.9936 0.0000 0.0064 0.0000
6 I0 ~6 K% \( G: V4 K- I 0.1686 0.2604 0.2242 0.3398 0.00706 L* Q) |$ k( Z3 Q
0.0053 0.0406 0.8350 0.1184 0.0007
5 x* Y. V; a" a! m7 G$ l' J0 z* ~obsmat2 =
0.0000 0.2351 0.5738 0.0256 0.1118 0.0186 0.03518 J; a# y/ E, D* T4 |: Y+ [/ T1 N
0.0000 0.8270 0.0000 0.0790 0.0256 0.0456 0.02280 t( I. A! ^) _# w# f; H+ a* k
0.7514 0.0021 0.0011 0.0550 0.1472 0.0432 0.0000
& ]4 D C4 m+ @ ^" K7 B: D 0.0014 0.4208 0.0447 0.4366 0.0023 0.0887 0.0055. Q$ v, ^' i, s7 Q' ], q0 I! \+ e3 b6 S
0.0000 0.0784 0.3223 0.2014 0.0116 0.1525 0.2338 iteration 1, loglik = -277.738670: ], T4 Q4 p+ I0 E( ?
iteration 2, loglik = -242.163247
$ d; y" |. ~2 e) a/ riteration 3, loglik = -238.321971
/ _, N: z$ C1 `* d1 ?' x! Z( literation 4, loglik = -233.166746
{* u/ I) u2 I6 j0 B. Jiteration 5, loglik = -225.682259' p) C5 \; p1 q8 f1 |8 x
iteration 6, loglik = -214.560296
% d3 c" @5 G; c, |9 Z# |5 Biteration 7, loglik = -201.182015
3 R/ Z) B3 W( B: Z- F8 kiteration 8, loglik = -189.427453
4 X$ Q7 A. V( q9 k N4 L$ A& M' Riteration 9, loglik = -179.156352' o- Y9 h8 k! P( w2 P- |6 T; x! J8 j
iteration 10, loglik = -171.744096
1 E& ~$ W) ~4 _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 / B7 c6 n: Y4 q) g6 ]( C2 [
prior4 = 0.0000) d$ u2 o/ P& G/ L$ u6 V
0.9982
9 `5 h* `" t" H8 c9 l8 x. m% v 0.0004
# x% j+ O, J! n6 \. a4 s 0.0014
& |( N Y/ q: x9 i 0.0000
' G& J" O0 S: W. W6 Etransmat4 =
0.0873 0.5277 0.2799 0.1007 0.0045* S" v3 g- q6 P% G6 Q
0.0002 0.0000 0.0005 0.0000 0.9994& O( x( t9 [" r8 k9 N
0.0180 0.0000 0.0118 0.0011 0.9692
; q$ w: T3 h6 b8 K 0.0436 0.0226 0.0810 0.0219 0.8310* X9 Q! C* z% _* |. B
0.9746 0.0056 0.0003 0.0195 0.0000
, M2 w* x$ j" _. e9 Vobsmat4 =
0.0000 0.2012 0.5080 0.0580 0.1093 0.0465 0.0770
6 C! G/ k8 G9 ?2 t; A% ~8 O. B 0.7939 0.0001 0.0000 0.0745 0.1277 0.0038 0.00002 y' ]/ X C7 N
0.4120 0.1044 0.0049 0.1736 0.0032 0.3017 0.0001! M5 V- ?0 |; L" O. C
0.4527 0.0622 0.0637 0.2568 0.0549 0.0295 0.08024 R+ K7 T6 b+ k* w: j0 c; m
0.0000 0.8172 0.0000 0.0943 0.0270 0.0389 0.0225 7 d6 [" S3 T% k' a
data1 = 5 2 4 1 2 2 5 2 3 7 1 6 2 ; o. I3 [# ^0 m, ]
loglik = -19.2351 - J: l z+ a' |% b ?
loglik2 = -21.0715 9 _9 U. c- x/ j9 \: r) K
path = 3 2 5 3 2 1 3 2 1 5 3 2 1 - [$ ~; N) Q8 w9 M# j
path2 = 2 5 1 2 5 1 2 5 1 1 2 5 1
$ E. U" q; H5 u4 G5 @' Qfuhe =
1 |