% ①定义一个HMM并训练这个HMM。
' i) h) j f3 ]* K$ ]% ②用一组观察值测试这个HMM,计算该组观察值域HMM的匹配度。
1 Q' `- R1 y3 e4 j% 修改:旺齐齐
; o4 j4 ~2 o6 A2 l- @: _' x! J% 修改部分为:添加 HMM2 模型。测试一个观察序列更加符合哪个哪个HMM模型。
3 @" ]. X+ k) N* ^' f% e%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % O:观察状态数! J# Z) Q2 O# w/ S4 S! [$ `
O = 7;
. A; d- O! Z# BO2 = 7;0 y5 e+ j- ?( U+ i( {3 |, L1 T
% Q:HMM状态数
) P' o* r4 U, i! q4 `- g, ^" ~Q = 5;% W. u8 i9 w" s4 J Q) \3 d- m' I
Q2 = 5;
3 n1 a) ?0 U. ?" i9 @# J. z%训练的数据集,每一行数据就是一组训练的观察值+ j* a1 c, Y1 l1 P
data=[1,2,3,1,2,2,4,2,3,1,2,7,2;
% p& A8 f u- ]" x+ c ^+ Z 1,2,3,6,2,2,1,4,3,1,5,3,1;$ A6 N6 O x& h6 {( C
1,2,3,1,2,5,1,2,4,1,2,3,2;& e! B& U& L2 ^" D0 ?
1,2,7,1,2,2,1,2,5,1,2,4,1;
" H1 g' l2 b7 } `7 q1 A 5,2,3,3,5,2,1,2,3,1,2,3,6;
' j% b/ ], B0 G }' Y) ^" F7 p 1,2,3,1,2,2,1,6,5,1,2,6,4;
# ~* W9 T5 l; o# k; T4 r 5,2,3,4,4,2,1,2,3,1,2,5,6;4 T+ B& U3 ]* A7 B( b4 h. d
1,2,6,1,2,2,1,2,3,1,4,3,2;- r3 ^# ]( c* J' _' B5 n0 C
1,2,3,4,2,7,1,4,3,1,7,3,3;
( d; ~: c" h2 |4 g 5,2,3,5,2,2,1,2,3,1,2,3,4;# W1 d Q) ~$ \- \3 t3 \' t
5,2,4,1,2,2,5,2,3,7,1,6,2;]
: G- E5 j5 `' A. i! H% C data2 = [1,2,3,1,2,2,4,2,3,1,2,7,2;. J, o9 ?' c1 J7 M" z# z
1,2,3,6,2,2,1,4,3,1,5,3,1;; @6 Z* p- a7 V
1,2,3,1,2,5,1,2,4,1,2,3,2;
2 O+ J1 n& [0 i5 l- N: Q# y1 w 1,2,7,1,2,2,1,2,5,1,2,4,1;* O4 ~: a9 |0 B0 v( g; r! _3 h0 l
5,2,3,3,5,2,1,2,3,1,2,3,6;8 Z, G; _6 F, i
1,2,3,1,2,2,1,6,5,1,2,6,4;# w8 R" G' r7 ~' G9 `% r
5,2,3,4,4,2,1,2,3,1,2,5,6;( A& V+ a" @/ a% Z; R' x) ]8 c- F- ~
1,2,6,1,2,2,1,2,3,1,4,3,2;' ^& X& G8 J( ~* M
1,2,3,4,2,7,1,4,3,1,7,3,3;+ ?- u" @$ c; \
5,2,3,5,2,2,1,2,3,1,2,3,4;
9 X) n. s. J9 B8 Y4 ^1 V 4,2,5,1,2,2,6,2,3,7,1,6,4;]
% initial guess of parameters* p! X/ Z2 @& I, ~
% 初始化参数! o$ P# Z9 O& S/ Y4 v
prior1 = normalise(rand(Q,1));9 q( [/ q- y( z5 A K
transmat1 = mk_stochastic(rand(Q,Q));2 p! }, Q; [. h
obsmat1 = mk_stochastic(rand(Q,O)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%, S% O$ C% x8 |! @7 z# `
% 添加部分
7 u7 z& N( p: b! r prior3 = normalise(rand(Q2,1));- V- e, p; X" T" S
transmat3 = mk_stochastic(rand(Q2,Q2));
8 M$ N- k& S0 Y1 t. @! [7 }7 D obsmat3 = mk_stochastic(rand(Q2,O2));
' t7 R. v& F8 P%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % improve guess of parameters using EM5 m' A$ B1 h- L3 c" {! y* r8 o" d0 z
% 用data数据集训练参数矩阵形成新的HMM模型/ y, Z& e: f* @9 O' A% N
[LL, prior2, transmat2, obsmat2] = dhmm_em(data, prior1, transmat1, obsmat1, 'max_iter', size(data,1));
9 B6 r' l' J: K L6 u! D# w n. U% 训练后那行观察值与HMM匹配度* X" z6 s- A% S
LL
6 g- [& o [3 C4 U% 训练后的初始概率分布3 x5 x; e( {$ Z T
prior23 T3 T9 d4 S! W1 R2 a! d$ X
% 训练后的状态转移概率矩阵
( L, |8 [8 M0 }9 {4 ytransmat2
' I) V* [ h8 v" N' Q4 P& ]% 观察值概率矩阵0 I1 |/ o7 O) l0 X1 Z9 B/ r
obsmat2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
' m1 Q( P* r, H( g; T% 添加部分
% |* R# S9 j3 r [LL2, prior4, transmat4, obsmat4] = dhmm_em(data2, prior3, transmat3, obsmat3, 'max_iter', size(data2,1));
) n+ L; A0 n( F! o# q! W LL2
F( N2 N: o: v: Q) l4 d prior4
5 j! T7 x4 u2 P! z transmat4- J% r( V S2 d d
obsmat4
; |: K. M/ U, I7 c/ }* D%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % use model to compute log likelihood
+ G2 t! U- \& T% data1=[1,2,3,1,2,2,1,2,3,1,2,3,1]
+ @) V- }3 c: zdata1 = [5,2,4,1,2,2,5,2,3,7,1,6,2]# y4 ^+ @% ~1 k! ?
loglik = dhmm_logprob(data1, prior2, transmat2, obsmat2)9 t7 l1 _1 s4 W
% log lik is slightly different than LL(end), since it is computed after the final M step
/ F! r) c6 V* Q' A& [% loglik 代表着data和这个hmm(三参数为prior2, transmat2, obsmat2)的匹配值,越大说明越匹配,0为极大值。 % path为viterbi算法的结果,即最大概率path %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
G* G& d4 ?1 U" N w. V% 添加部分1 q! \: [7 ^9 G5 N- x3 J! N
loglik2 = dhmm_logprob(data1, prior4, transmat4, obsmat4)
! m: y% B+ b: ` b" i: L%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % q' U/ c( N: o: c9 _
B = multinomial_prob(data1,obsmat2);
8 Z A0 w: s l1 i2 v- Ypath = viterbi_path(prior2, transmat2, B)' j; g0 s* y9 a( n9 ?0 u3 a
save('sa.mat');
6 T+ F9 y+ P& N( u: r%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
: |9 y A4 a" j7 p( }8 J$ {! u% 添加部分) n7 F3 R; b% f$ [" g9 \/ {+ S
B2 = multinomial_prob(data1,obsmat4);
$ n9 S( P) [% \* ?$ v4 Z2 C, A path2 = viterbi_path(prior4, transmat4, B2)4 y2 i% f# d( b, N9 {3 m
save('sa2.mat');0 J# W" y; p$ |5 J' x6 l2 Y
if loglik2 > loglik . y/ `& u5 |# S- W) U9 v" W+ I. X
fuhe = 25 E$ ^, ?6 P3 y: @9 ]" {
else* L4 \- v9 U* x7 \* [
fuhe = 13 P% x& }* G! h) ]# M8 }( P
end , a0 n; |2 l, \+ m
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
------ 运行结果 ------ data = 1 2 3 1 2 2 4 2 3 1 2 7 2
; f4 u$ o2 U" V0 J8 v, k 1 2 3 6 2 2 1 4 3 1 5 3 1! G) i" ?" O% e
1 2 3 1 2 5 1 2 4 1 2 3 2
$ B1 \$ Z7 W* B/ A( s 1 2 7 1 2 2 1 2 5 1 2 4 1
E7 }+ R$ d6 n% u$ i0 I, @1 _ 5 2 3 3 5 2 1 2 3 1 2 3 6; d9 g! \. S- S! k0 E
1 2 3 1 2 2 1 6 5 1 2 6 4
( R$ a9 c G0 Z+ r: r 5 2 3 4 4 2 1 2 3 1 2 5 6
] ?. W) U, ? 1 2 6 1 2 2 1 2 3 1 4 3 2
9 n: E7 H4 t2 x$ I7 O& j4 | 1 2 3 4 2 7 1 4 3 1 7 3 3
# @0 l: U. C& t# m1 X* _ 5 2 3 5 2 2 1 2 3 1 2 3 4
& I( Z' W& z* _ 5 2 4 1 2 2 5 2 3 7 1 6 2 * q1 S3 [; ]9 m4 a
data2 = 1 2 3 1 2 2 4 2 3 1 2 7 2
0 s E$ m. g% U' _9 O$ T7 M 1 2 3 6 2 2 1 4 3 1 5 3 1
+ X+ D2 N. I) @9 N5 H4 u5 x 1 2 3 1 2 5 1 2 4 1 2 3 2
& A; F+ {8 h3 c2 _5 U 1 2 7 1 2 2 1 2 5 1 2 4 1
; l7 T7 g6 n& J8 D9 F- E2 b 5 2 3 3 5 2 1 2 3 1 2 3 61 t$ v1 m; X0 j. Z$ p% ?1 _3 I
1 2 3 1 2 2 1 6 5 1 2 6 4' A k5 z5 g$ f, `; M% E) f
5 2 3 4 4 2 1 2 3 1 2 5 6
3 M5 m3 ]) ?0 b' t0 q 1 2 6 1 2 2 1 2 3 1 4 3 2
3 d; j9 H& \8 t& G 1 2 3 4 2 7 1 4 3 1 7 3 3
& E" [7 V9 E6 N! v/ U4 w 5 2 3 5 2 2 1 2 3 1 2 3 4
6 Z: V- i7 `" f3 W$ d6 k# b 4 2 5 1 2 2 6 2 3 7 1 6 4 iteration 1, loglik = -327.100465* b4 `3 \) {( X5 g9 \
iteration 2, loglik = -238.259812
! O7 ] ]5 {" d9 v5 a2 p( ?iteration 3, loglik = -232.962948
; q+ s+ g1 _3 z5 n6 E5 b! Q8 x7 Riteration 4, loglik = -223.323891
9 U) ~+ @$ H! T/ w2 z. miteration 5, loglik = -207.630875
0 C5 C0 s' f6 e- \* [5 ?- H, _iteration 6, loglik = -191.012697" m3 I0 Q! o. ~: T
iteration 7, loglik = -178.611546
- ^) k6 b7 D+ n& miteration 8, loglik = -171.524132" ^( r# Y' ~1 f
iteration 9, loglik = -168.626526
2 ], F5 b+ E; _ I! ziteration 10, loglik = -167.3870570 n1 C& {8 h8 D4 `+ V
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 / o3 T* Z3 { t1 g
prior2 = 0.0000# O- L2 M. s; w# N* t r
0.0000) R. t3 j1 c P( c3 c8 N$ w
1.0000
: e# B: R% ~) V/ l$ X; H- o$ d 0.0000
# U* _7 d: z6 ~# P 0.0000 4 S) l5 V( l+ X) S6 ^! J% `" ~
transmat2 = 0.0138 0.0089 0.7680 0.1060 0.1033
3 _$ ?' V2 U) k/ P a3 `. j 0.7811 0.0000 0.0199 0.0067 0.1923
( L9 a/ y4 c1 ~+ ^2 r; } 0.0000 0.9936 0.0000 0.0064 0.0000
' k' g& j3 @- n; F 0.1686 0.2604 0.2242 0.3398 0.00705 b! Y+ P% s2 B$ C: Z9 ]" T! c |
0.0053 0.0406 0.8350 0.1184 0.0007 ( |& E/ I$ T0 w& J% A; G
obsmat2 = 0.0000 0.2351 0.5738 0.0256 0.1118 0.0186 0.0351
+ v+ ^: E' V# m9 g- R. j4 E& Q T 0.0000 0.8270 0.0000 0.0790 0.0256 0.0456 0.0228
. o0 l I: n1 B6 U; r+ Q. m+ q 0.7514 0.0021 0.0011 0.0550 0.1472 0.0432 0.0000
4 F" ?$ r6 f& H 0.0014 0.4208 0.0447 0.4366 0.0023 0.0887 0.00555 c8 }3 }, v9 \3 {2 h3 a$ }
0.0000 0.0784 0.3223 0.2014 0.0116 0.1525 0.2338 iteration 1, loglik = -277.738670
& D" o% k4 M6 R8 Q/ Q5 G Qiteration 2, loglik = -242.163247
8 S7 j/ O8 ^: n( `& siteration 3, loglik = -238.3219714 Y" Q* N+ U0 w. w& l
iteration 4, loglik = -233.166746
/ |. Q% J6 a3 y# [iteration 5, loglik = -225.682259( |, X5 {2 q; e: S; T
iteration 6, loglik = -214.560296; b( g. l2 w, U5 A/ D
iteration 7, loglik = -201.1820152 r; X+ I) H; P0 f
iteration 8, loglik = -189.427453
x& ^. K. h% q8 `1 Siteration 9, loglik = -179.1563523 \2 W" h+ s0 ?
iteration 10, loglik = -171.744096, J i: ^! N* z0 o( a
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 * Q6 G2 o9 T8 V O
prior4 = 0.00009 K( D6 g, M6 n9 g" o8 {
0.9982! s# [) z7 ^* z& a$ X
0.00048 W7 }/ @% V7 O! [
0.0014
- c9 u! g4 i7 {- s C: ?; ] 0.0000
/ d$ s2 V( V; R! Qtransmat4 =
0.0873 0.5277 0.2799 0.1007 0.00454 ~, d9 A+ z# G7 u
0.0002 0.0000 0.0005 0.0000 0.9994) U- J. I6 B8 w, Y! P
0.0180 0.0000 0.0118 0.0011 0.9692
, a: W( q' `' E6 U 0.0436 0.0226 0.0810 0.0219 0.8310
8 V9 U; H8 f% Q: F 0.9746 0.0056 0.0003 0.0195 0.0000 4 c" ~) W5 O) W5 ^, A
obsmat4 = 0.0000 0.2012 0.5080 0.0580 0.1093 0.0465 0.0770
( a9 T' b: z; q' U1 e 0.7939 0.0001 0.0000 0.0745 0.1277 0.0038 0.0000
( h4 `6 s" F2 A4 z 0.4120 0.1044 0.0049 0.1736 0.0032 0.3017 0.0001
6 a2 K" \8 x1 F6 n 0.4527 0.0622 0.0637 0.2568 0.0549 0.0295 0.0802, j( X% J" ^1 N
0.0000 0.8172 0.0000 0.0943 0.0270 0.0389 0.0225 5 u9 X4 V2 u v; c+ A2 t
data1 = 5 2 4 1 2 2 5 2 3 7 1 6 2
- _ N9 L! c1 V. ]3 \5 v( H, ?loglik =
-19.2351
. j8 U4 ~& t/ E* f' Z) j" o7 ]loglik2 =
-21.0715 5 t& S5 v* t: I2 z# `
path = 3 2 5 3 2 1 3 2 1 5 3 2 1
6 q+ q" ?4 ^* s" Hpath2 =
2 5 1 2 5 1 2 5 1 1 2 5 1
' @9 n- z+ v6 \7 Afuhe =
1 |