% ①定义一个HMM并训练这个HMM。
* x- k2 ^2 D. P% I+ ]: v5 }: N% ②用一组观察值测试这个HMM,计算该组观察值域HMM的匹配度。
9 k4 ]# F/ ?4 q: C3 L: m( l4 O% 修改:旺齐齐
0 ]: b4 ^ F3 m" _; r% 修改部分为:添加 HMM2 模型。测试一个观察序列更加符合哪个哪个HMM模型。9 K; F- |4 c/ }$ x& `- M" V
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % O:观察状态数
# n4 G* }+ j; R. OO = 7;+ E9 A5 Q4 d+ y& U; j% G: ^. F0 \% u
O2 = 7;
! T i4 e4 p- ?+ ~5 c, {3 Q% Q:HMM状态数
2 l& g& b! I' _ H( R6 |/ a8 T! CQ = 5;
' }7 I5 d! a- U7 K9 }! a7 RQ2 = 5;6 E, E/ e" |8 D: l6 B" p; Q
%训练的数据集,每一行数据就是一组训练的观察值: ~" ]+ e s' g) F
data=[1,2,3,1,2,2,4,2,3,1,2,7,2;9 p5 W1 O; z+ P
1,2,3,6,2,2,1,4,3,1,5,3,1;
l# W/ i! P! }9 \' e/ m4 B 1,2,3,1,2,5,1,2,4,1,2,3,2;
" a; l; V, [+ J% T3 n- @1 ` 1,2,7,1,2,2,1,2,5,1,2,4,1;
G) C" r2 A& u 5,2,3,3,5,2,1,2,3,1,2,3,6;
) P% h: ^7 H- v1 f5 r. V- a7 l 1,2,3,1,2,2,1,6,5,1,2,6,4;
B5 v% Q/ R$ C+ E y1 ^% G& p 5,2,3,4,4,2,1,2,3,1,2,5,6;/ t4 D, }3 T) i
1,2,6,1,2,2,1,2,3,1,4,3,2;' q. O+ K7 c a: o% b
1,2,3,4,2,7,1,4,3,1,7,3,3;0 p" C t; J2 X# H7 h3 G, q. W" J% e
5,2,3,5,2,2,1,2,3,1,2,3,4;
* h! b8 Y$ S7 N @$ l 5,2,4,1,2,2,5,2,3,7,1,6,2;] ' \7 d- J8 s3 K, s$ M" n) U
data2 = [1,2,3,1,2,2,4,2,3,1,2,7,2;3 B$ @7 N$ v2 O, m
1,2,3,6,2,2,1,4,3,1,5,3,1;1 W& ^0 x, x, k! S
1,2,3,1,2,5,1,2,4,1,2,3,2;5 S, L" d6 j7 ]0 Y
1,2,7,1,2,2,1,2,5,1,2,4,1;
8 r6 @* M) z% D8 p% h 5,2,3,3,5,2,1,2,3,1,2,3,6;# Y/ g* P' q$ j( t6 j( J6 ]2 g
1,2,3,1,2,2,1,6,5,1,2,6,4;* `% x$ _; y* h, C: e+ Q
5,2,3,4,4,2,1,2,3,1,2,5,6;
) @4 d+ J N/ L1 b 1,2,6,1,2,2,1,2,3,1,4,3,2;
, Y! F, {( |$ o( p/ ]2 b) H3 e 1,2,3,4,2,7,1,4,3,1,7,3,3;
5 y8 c* `( { U9 P4 L 5,2,3,5,2,2,1,2,3,1,2,3,4;# | `) o: R& r+ [- b* t
4,2,5,1,2,2,6,2,3,7,1,6,4;] % initial guess of parameters( n# o v+ m0 b8 N' ~ c
% 初始化参数8 E" M+ e7 G9 R0 Q# ~
prior1 = normalise(rand(Q,1));; l. L* O" ~: \9 l i) o
transmat1 = mk_stochastic(rand(Q,Q));/ {% W$ Z+ x+ b$ m8 [3 y2 f+ Z* `2 C- @
obsmat1 = mk_stochastic(rand(Q,O)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
& y; X. U; t7 h: M5 t# K5 d% 添加部分
" y+ Q/ o# O3 q prior3 = normalise(rand(Q2,1));
6 @8 j$ K0 D( { transmat3 = mk_stochastic(rand(Q2,Q2));
' R W% l, v A4 u obsmat3 = mk_stochastic(rand(Q2,O2));
- M* t: [ T+ P( A1 u%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % improve guess of parameters using EM) D n: U+ R' q
% 用data数据集训练参数矩阵形成新的HMM模型
- m7 @# n3 l; d! I9 {% p5 I[LL, prior2, transmat2, obsmat2] = dhmm_em(data, prior1, transmat1, obsmat1, 'max_iter', size(data,1));
' \1 M9 W& {7 i. A0 M! R% 训练后那行观察值与HMM匹配度, ^1 w/ P; z$ a* N* W
LL: l+ }' Y# ?( e4 L
% 训练后的初始概率分布
4 \5 T) P# l# O; K/ s4 sprior2 V4 X1 N2 w; ^
% 训练后的状态转移概率矩阵
! e4 T" E. `* J3 y4 t3 ]transmat2
4 c# T' C; Y+ k8 B; d$ W5 |$ m% 观察值概率矩阵
! `" H8 \/ E3 q* x- R: Gobsmat2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
( _" N, c( O$ x {5 S8 r) i5 Z% 添加部分$ n3 T: k: J: a. `" F4 U
[LL2, prior4, transmat4, obsmat4] = dhmm_em(data2, prior3, transmat3, obsmat3, 'max_iter', size(data2,1));
' s4 u: M8 r+ \, t$ R& l LL2) f# Y) f, [" j1 `; `9 L
prior4
( }0 C* ~0 L; e+ G- U) Y transmat48 u: i8 w/ D! I7 ?+ d# K V
obsmat4
* B$ w4 e& F" L. }+ V: f( e%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % use model to compute log likelihood
* n7 {% i3 P9 V% R# }. i/ ^' ~6 g% data1=[1,2,3,1,2,2,1,2,3,1,2,3,1]
2 L) Q6 p4 ]! G# L# p/ `- Udata1 = [5,2,4,1,2,2,5,2,3,7,1,6,2]* q- o6 N0 N' C* L* t
loglik = dhmm_logprob(data1, prior2, transmat2, obsmat2)
: ~. ^. s9 d7 O2 C, {3 G% log lik is slightly different than LL(end), since it is computed after the final M step1 S; m1 N& T$ M# s
% loglik 代表着data和这个hmm(三参数为prior2, transmat2, obsmat2)的匹配值,越大说明越匹配,0为极大值。 % path为viterbi算法的结果,即最大概率path %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%" u" s( i. e; ^, F
% 添加部分
2 }% T2 [8 r& i0 E& ?- a: C5 ^: rloglik2 = dhmm_logprob(data1, prior4, transmat4, obsmat4)
6 _8 H, ]/ I% v" X Y$ R%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
U0 L; D, v- j# X ?B = multinomial_prob(data1,obsmat2);; ], H7 M1 N; Z! x
path = viterbi_path(prior2, transmat2, B)5 Z% w$ t" o: [: P% h9 u7 F* w1 \
save('sa.mat');
$ J3 v! i5 ^) s. B
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 {: A- ]5 b, d* k; `, ^7 Z6 g# x
% 添加部分$ l2 ]" e' c# F' a1 M
B2 = multinomial_prob(data1,obsmat4);3 B' e$ r4 Y5 F$ G# K. X: A
path2 = viterbi_path(prior4, transmat4, B2)
/ [$ E$ x8 y: I* o! Z save('sa2.mat');
; N; E* v7 n. ?4 N' Z if loglik2 > loglik , ^. h* q; P7 k% n( w- Z/ \
fuhe = 2: ^- v/ F# {% {0 E3 k$ C
else9 K3 v3 ~1 Z" z8 b; M' j
fuhe = 1( Z7 t9 p* n) |- n7 a+ ?. I
end % T/ o/ H% Q& G$ ?3 T/ T8 T
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ------ 运行结果 ------ data = 1 2 3 1 2 2 4 2 3 1 2 7 2
8 y& Z5 u) u* M. ? 1 2 3 6 2 2 1 4 3 1 5 3 1, r6 u/ p0 |) D( c
1 2 3 1 2 5 1 2 4 1 2 3 2
5 x- C* S1 j! w2 S' T 1 2 7 1 2 2 1 2 5 1 2 4 12 B7 a# v8 e3 U, {- l
5 2 3 3 5 2 1 2 3 1 2 3 65 ?7 ]; [5 @% a+ ^6 [
1 2 3 1 2 2 1 6 5 1 2 6 4, n4 \1 p: C0 ?1 n! y: K% I
5 2 3 4 4 2 1 2 3 1 2 5 60 l: ^* d" U6 H' ]- \) y
1 2 6 1 2 2 1 2 3 1 4 3 23 i$ H+ \! p# k m. l U0 X Q
1 2 3 4 2 7 1 4 3 1 7 3 3
4 U' n0 D4 \2 N- Y8 c8 Q 5 2 3 5 2 2 1 2 3 1 2 3 4
9 x) i r7 ]5 h& Z- r D" v4 k 5 2 4 1 2 2 5 2 3 7 1 6 2
/ Z6 y) a, ~" O, rdata2 =
1 2 3 1 2 2 4 2 3 1 2 7 23 ?" Z6 F9 Z3 y8 C# l
1 2 3 6 2 2 1 4 3 1 5 3 1" g& s1 G4 N) P7 }
1 2 3 1 2 5 1 2 4 1 2 3 2
7 n( J8 o ^; P0 N+ i 1 2 7 1 2 2 1 2 5 1 2 4 1
( M' h+ W- n# r9 ]3 ? 5 2 3 3 5 2 1 2 3 1 2 3 64 o- Z9 c7 T$ B, G/ j5 [
1 2 3 1 2 2 1 6 5 1 2 6 44 E. r2 n- F( P6 S$ B
5 2 3 4 4 2 1 2 3 1 2 5 6
; g' n1 |4 c" G7 j, i' A t 1 2 6 1 2 2 1 2 3 1 4 3 2
* @; l# V! ]9 k# v$ T 1 2 3 4 2 7 1 4 3 1 7 3 3
# ? i, x; p6 l; E5 f4 \+ ` 5 2 3 5 2 2 1 2 3 1 2 3 4
! e' l/ V/ b; I; C9 N 4 2 5 1 2 2 6 2 3 7 1 6 4 iteration 1, loglik = -327.100465
) M+ T7 @( B* i9 ? `iteration 2, loglik = -238.259812
% T8 n/ y% {7 G6 Viteration 3, loglik = -232.962948
3 q1 s) N+ {. J! v8 ^' C, ^1 Niteration 4, loglik = -223.323891
8 O' Z, y2 s+ |3 }iteration 5, loglik = -207.630875
8 G" z. c! e* miteration 6, loglik = -191.012697
3 Z: q' ~2 F5 N& miteration 7, loglik = -178.6115462 n3 U$ @, E! n1 S9 L; t. L9 ]
iteration 8, loglik = -171.524132
! v. h9 e" C/ }/ giteration 9, loglik = -168.626526
+ M- g3 A! x9 O0 }7 W; S& Qiteration 10, loglik = -167.387057
3 o- F) v1 e$ L7 P+ ?2 Titeration 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 3 w. t) O, ~" @8 b! D$ |9 B
prior2 = 0.00005 S, c! c* A$ t% D& z- k- z
0.00005 k. }) B" I9 D. q- e9 ]/ D
1.0000
, U$ [6 x' H% V1 \ 0.0000
! Z9 j" |0 D. c9 t 0.0000
, ^! X% V1 U4 H1 z2 h4 A1 utransmat2 =
0.0138 0.0089 0.7680 0.1060 0.1033
* m j; ~: o# l6 J _ 0.7811 0.0000 0.0199 0.0067 0.1923* t+ _: A1 e+ L) B
0.0000 0.9936 0.0000 0.0064 0.00008 |) J) C" _+ }. j" f
0.1686 0.2604 0.2242 0.3398 0.0070
9 D) t( {0 r+ ?" h y2 E" c 0.0053 0.0406 0.8350 0.1184 0.0007 $ t6 A5 T! i/ b; h+ g X' X
obsmat2 = 0.0000 0.2351 0.5738 0.0256 0.1118 0.0186 0.0351
9 c+ I. R6 l" w) n9 W 0.0000 0.8270 0.0000 0.0790 0.0256 0.0456 0.0228
$ z$ Y% _6 R: O9 n, [ 0.7514 0.0021 0.0011 0.0550 0.1472 0.0432 0.0000
' m6 S( t) n+ d& E) I7 X% ?6 H( [ 0.0014 0.4208 0.0447 0.4366 0.0023 0.0887 0.0055: p) J8 e' O% q2 q" v1 y
0.0000 0.0784 0.3223 0.2014 0.0116 0.1525 0.2338 iteration 1, loglik = -277.7386707 c: H1 h6 g4 C5 c6 ?
iteration 2, loglik = -242.163247: d' l# m8 u. }# p7 u
iteration 3, loglik = -238.321971
! u6 {1 Q$ q6 [# M A+ L; kiteration 4, loglik = -233.166746
- Y( t% L) `4 Diteration 5, loglik = -225.6822592 I! j+ W1 p* v) X8 t3 u# i v- M F
iteration 6, loglik = -214.5602968 x# J4 X1 c( w. k/ R8 o& H0 Q+ _5 Y
iteration 7, loglik = -201.182015% w2 }" a! b: n
iteration 8, loglik = -189.427453! F( h) e$ L# `0 ]2 n. X# B4 }8 {
iteration 9, loglik = -179.156352. f" G2 K3 r2 H0 R& ?
iteration 10, loglik = -171.744096
# c. t8 z/ L" m& x( @; qiteration 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 4 R I4 j; p& v7 v8 H2 O1 y
prior4 = 0.0000: d4 w( l9 u& {, [1 I9 g
0.99820 f' w. r. E9 S) u. w# R7 D
0.0004
% }* Q, K4 ?7 q2 ~. x 0.0014
) {0 f! m* u! P/ ~5 f9 N4 M9 B3 g 0.0000
3 U& k1 K e/ G0 M$ z9 H: j+ qtransmat4 =
0.0873 0.5277 0.2799 0.1007 0.0045
8 V! O3 x Q: l. y4 {0 ^ 0.0002 0.0000 0.0005 0.0000 0.9994
# m/ a! T; t$ G5 Q 0.0180 0.0000 0.0118 0.0011 0.9692
& q- T5 l% T: I$ H1 ~9 ]( [ 0.0436 0.0226 0.0810 0.0219 0.8310
7 J7 q) ^0 o# K# n( E- g 0.9746 0.0056 0.0003 0.0195 0.0000
5 P% z) Y1 ^; g, t! Z# n; ]obsmat4 =
0.0000 0.2012 0.5080 0.0580 0.1093 0.0465 0.0770
6 b8 P' Q2 B) N4 Z9 s4 C 0.7939 0.0001 0.0000 0.0745 0.1277 0.0038 0.0000
2 f" M" U! P) @4 e7 O' ?1 a5 q 0.4120 0.1044 0.0049 0.1736 0.0032 0.3017 0.0001( I' p/ A7 o* r1 |6 ^+ Z6 t/ t# m
0.4527 0.0622 0.0637 0.2568 0.0549 0.0295 0.0802
# x1 w* {# u' b3 a, G$ Q 0.0000 0.8172 0.0000 0.0943 0.0270 0.0389 0.0225 ! X) q: u* @/ N! h9 n
data1 = 5 2 4 1 2 2 5 2 3 7 1 6 2 ! ?; e/ R, j" P" D6 n8 Q
loglik = -19.2351 : r5 |/ g/ R2 H3 H7 C% D
loglik2 = -21.0715
6 D! \0 K8 F7 Bpath =
3 2 5 3 2 1 3 2 1 5 3 2 1
+ _9 G4 b' x8 e* l4 h8 R* ]+ N, W) qpath2 =
2 5 1 2 5 1 2 5 1 1 2 5 1 6 B2 U( ]/ h7 Z2 k$ n
fuhe = 1 |