% ①定义一个HMM并训练这个HMM。& p* D, R* [2 Q" G9 G- }: V+ I
% ②用一组观察值测试这个HMM,计算该组观察值域HMM的匹配度。( U! j( @8 X# K6 _2 L
% 修改:旺齐齐
7 v4 I, P4 T; s% 修改部分为:添加 HMM2 模型。测试一个观察序列更加符合哪个哪个HMM模型。
! e* b$ B, t% @%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % O:观察状态数
5 l5 y* U- v6 U4 UO = 7;9 X; F9 _! N. b- K6 N0 n
O2 = 7;8 P+ \- R$ V4 {$ D5 h
% Q:HMM状态数
# i a5 C; p; P, r* F. Y3 zQ = 5;
2 ?, ]4 X6 X6 M0 `Q2 = 5;# O, _2 P# ]9 m( C
%训练的数据集,每一行数据就是一组训练的观察值
" j9 o x/ e# c. ]- r; b( mdata=[1,2,3,1,2,2,4,2,3,1,2,7,2;! m. Y' F' d2 A- q
1,2,3,6,2,2,1,4,3,1,5,3,1;$ Y8 \* v! w( f" W, r
1,2,3,1,2,5,1,2,4,1,2,3,2;& B4 O9 i: }1 m8 S8 y
1,2,7,1,2,2,1,2,5,1,2,4,1;' ~1 `* g5 \1 v1 l
5,2,3,3,5,2,1,2,3,1,2,3,6;
, p8 g7 R- u/ k1 Z' j" b 1,2,3,1,2,2,1,6,5,1,2,6,4;/ r. w# ?# N8 h8 d w2 h4 e
5,2,3,4,4,2,1,2,3,1,2,5,6;
8 ]8 ^8 p2 I$ q/ q% ^! X- m$ s6 n0 | 1,2,6,1,2,2,1,2,3,1,4,3,2;; x. i' o# R. C0 d
1,2,3,4,2,7,1,4,3,1,7,3,3;* J0 S; o$ H: @
5,2,3,5,2,2,1,2,3,1,2,3,4;
+ I/ T: m, ?4 z7 o o 5,2,4,1,2,2,5,2,3,7,1,6,2;]
2 ^& J+ M+ N4 }; s$ Y4 M data2 = [1,2,3,1,2,2,4,2,3,1,2,7,2;& t' `6 S1 w D% ]' x+ g$ S
1,2,3,6,2,2,1,4,3,1,5,3,1;
, d# D' D; n6 F 1,2,3,1,2,5,1,2,4,1,2,3,2;
. B _4 g' {2 q' z( K 1,2,7,1,2,2,1,2,5,1,2,4,1;4 x# l: r" d1 B5 z
5,2,3,3,5,2,1,2,3,1,2,3,6;
+ J+ {7 K+ e6 r7 p 1,2,3,1,2,2,1,6,5,1,2,6,4;$ d& x- y' G" ]+ n' b3 B
5,2,3,4,4,2,1,2,3,1,2,5,6;
) j+ I8 {( y* ]; U: m& Q 1,2,6,1,2,2,1,2,3,1,4,3,2;' p2 M* p3 Y- q- y" i, o
1,2,3,4,2,7,1,4,3,1,7,3,3;) x6 v/ M: I4 p6 r+ W
5,2,3,5,2,2,1,2,3,1,2,3,4;
( a+ }( H e* D. j& A `: N o. x 4,2,5,1,2,2,6,2,3,7,1,6,4;]
% initial guess of parameters) T' c p% e2 u* J m g
% 初始化参数
/ h3 R% h2 J8 W1 \( O- P( pprior1 = normalise(rand(Q,1));
' P- j x$ a7 ]% }, a |transmat1 = mk_stochastic(rand(Q,Q));
( r9 m( O M" hobsmat1 = mk_stochastic(rand(Q,O)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2 { w% W$ y1 U# r9 {5 Y' R% l! j% 添加部分
0 B( {- N3 H0 {6 i i: H/ o prior3 = normalise(rand(Q2,1));9 ~4 s( y& C) V+ u
transmat3 = mk_stochastic(rand(Q2,Q2));0 Z( [1 F9 ~6 S( C) g6 ^
obsmat3 = mk_stochastic(rand(Q2,O2));" b' I- c4 F6 k; c; r
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % improve guess of parameters using EM0 |; N6 L4 K3 Y$ M' |
% 用data数据集训练参数矩阵形成新的HMM模型
! n$ o& C5 h$ H! B( o[LL, prior2, transmat2, obsmat2] = dhmm_em(data, prior1, transmat1, obsmat1, 'max_iter', size(data,1));9 O3 u6 i9 U' h8 N
% 训练后那行观察值与HMM匹配度 _! A8 w: s: c o) C- H
LL
/ c% O Z3 {8 E! w W% 训练后的初始概率分布* k" B7 W! ^* w' I9 K" ?) M1 F
prior26 I+ l% i# c/ i) M$ R6 ~5 i1 f
% 训练后的状态转移概率矩阵) ~* u' a7 n( C" N& h# k. O
transmat2
3 H3 y3 s& l$ k! L% 观察值概率矩阵
! w- g5 L2 _# T+ E; ]+ {obsmat2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%, h( W! h- ~. l( [$ M2 m: r9 T' s
% 添加部分
* q% b- ~. o$ y% D9 R8 U [LL2, prior4, transmat4, obsmat4] = dhmm_em(data2, prior3, transmat3, obsmat3, 'max_iter', size(data2,1));) l7 w- ~) C( K6 N% H. m) C
LL2- v5 l4 E- | O: U% ?% k1 v2 ]
prior4
1 v8 H6 `4 X) z1 Y5 h4 \# b transmat46 `% U- w0 A F- t) F
obsmat4
& Q5 i3 Y1 y! u1 V: o% U: Q. D%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % use model to compute log likelihood5 I! v4 T" ~8 y/ m$ ~
% data1=[1,2,3,1,2,2,1,2,3,1,2,3,1]
6 N/ _! D" \! }data1 = [5,2,4,1,2,2,5,2,3,7,1,6,2]
7 A* a8 }( y' e. ploglik = dhmm_logprob(data1, prior2, transmat2, obsmat2)3 }7 \7 h$ l! n0 ~" g9 M- }
% log lik is slightly different than LL(end), since it is computed after the final M step
% N4 |4 W* M& z7 ^ x9 f; R" P% loglik 代表着data和这个hmm(三参数为prior2, transmat2, obsmat2)的匹配值,越大说明越匹配,0为极大值。 % path为viterbi算法的结果,即最大概率path %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%" I4 f+ r7 ]1 d9 D3 G( C/ y
% 添加部分
& x# X" m$ H) W1 R+ U3 n8 eloglik2 = dhmm_logprob(data1, prior4, transmat4, obsmat4)
! ?+ f7 F! z0 v, J4 N" t1 B%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
" w. e0 X* z' F3 ?1 A kB = multinomial_prob(data1,obsmat2);
8 M% v8 } _ D4 C. d6 [) [+ xpath = viterbi_path(prior2, transmat2, B)
0 O/ A( `6 P( M- @ C1 Tsave('sa.mat');
. B( N# K! M& H" ^; x%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ i* n! m) K7 e2 k e& I( {% 添加部分
3 o" F5 Z* ^! @' J0 G. E" {- B% } B2 = multinomial_prob(data1,obsmat4);# K4 ]: l) H5 X U2 J
path2 = viterbi_path(prior4, transmat4, B2)
2 b- v: i% C" f% Y* e @5 q save('sa2.mat');. `, u. i# |, k( Y2 M
if loglik2 > loglik 6 W1 o7 R! j. \6 p
fuhe = 2
" m2 M, V7 H( m6 {6 i! w else. }0 S9 A2 O$ A1 `# z# C% I% C
fuhe = 1
2 Y& B E( P* Y+ G# P ? end 3 c" y) g* ~* Q b8 T+ F# o
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
------ 运行结果 ------ data = 1 2 3 1 2 2 4 2 3 1 2 7 29 u7 o$ s! e7 o: x: R7 f
1 2 3 6 2 2 1 4 3 1 5 3 1 D. }/ x( m% G' ?- R
1 2 3 1 2 5 1 2 4 1 2 3 2
: f! O; c; y! f c. O2 D 1 2 7 1 2 2 1 2 5 1 2 4 1 b& a" @7 r& D9 n1 a t1 x) @
5 2 3 3 5 2 1 2 3 1 2 3 6+ Y" m' r, I' D4 Q
1 2 3 1 2 2 1 6 5 1 2 6 4+ h0 s: W2 M# d0 W$ D3 O
5 2 3 4 4 2 1 2 3 1 2 5 6
2 a& Z; ~* @0 {0 x* M0 c' I 1 2 6 1 2 2 1 2 3 1 4 3 2
% U" E$ E* _7 a8 ]" Q t 1 2 3 4 2 7 1 4 3 1 7 3 3
9 M" s6 j7 W" G1 r- r: B 5 2 3 5 2 2 1 2 3 1 2 3 4, R: I: `; {3 F4 P7 R" X# a' ~) N
5 2 4 1 2 2 5 2 3 7 1 6 2
9 |& n) @7 _3 A6 W2 p$ o+ kdata2 =
1 2 3 1 2 2 4 2 3 1 2 7 2
' w+ M2 T5 o) q3 O0 e% ^ 1 2 3 6 2 2 1 4 3 1 5 3 1' M" \4 k) x2 L! |2 Y4 q
1 2 3 1 2 5 1 2 4 1 2 3 2
' Z( G2 A( y* e% ?8 W1 t8 }$ K: B 1 2 7 1 2 2 1 2 5 1 2 4 1
$ {; f! r$ E9 [9 H5 o: C4 A) a% g 5 2 3 3 5 2 1 2 3 1 2 3 6+ G) ^1 {" e3 m' w3 q
1 2 3 1 2 2 1 6 5 1 2 6 4
5 A1 m4 \/ r4 ?+ J% j 5 2 3 4 4 2 1 2 3 1 2 5 6, ?# D* R. \4 A- C- W5 I
1 2 6 1 2 2 1 2 3 1 4 3 29 H* ?( Q) {* Z t U4 [; b5 R# m$ ]* u
1 2 3 4 2 7 1 4 3 1 7 3 3, P7 `# U) t2 M
5 2 3 5 2 2 1 2 3 1 2 3 4
% D1 S7 Z; C; ?4 b5 d7 s& G' Q 4 2 5 1 2 2 6 2 3 7 1 6 4 iteration 1, loglik = -327.100465
! H' p1 r) q7 d2 P0 S: [. F# D# d/ _3 ?3 ]' [iteration 2, loglik = -238.259812
]" j! k; n# g$ K9 ^8 fiteration 3, loglik = -232.962948) `) Q5 s, a$ s! G& | j
iteration 4, loglik = -223.323891
R2 m) o# V7 O, S' C8 `, ]iteration 5, loglik = -207.6308754 O9 M- m' q1 i, K* z* F8 G
iteration 6, loglik = -191.012697* w9 b) h' Q/ h$ V1 G/ P
iteration 7, loglik = -178.611546: P8 w. T% t, V+ P
iteration 8, loglik = -171.524132
- T. `/ d, h4 {iteration 9, loglik = -168.626526, I0 B& Y% E, L& B% ^3 @+ A0 B) I
iteration 10, loglik = -167.387057" u& s5 u0 [8 g' `
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 3 m5 { d! t D! k& p) A
prior2 = 0.0000
" N& R- b w; h3 d, s A 0.0000
% C* _: D0 E5 U, t8 v/ m% a5 v 1.0000
" o6 L. O+ b) E* X# T) b 0.0000
" q1 \# r, N" K7 R 0.0000
5 ?1 I8 M" Q) h) Ctransmat2 =
0.0138 0.0089 0.7680 0.1060 0.1033' Z# H. w; D9 c$ b! f- z. `) ]& S
0.7811 0.0000 0.0199 0.0067 0.1923+ e( r$ m/ B. N
0.0000 0.9936 0.0000 0.0064 0.0000& d' @2 W }' x# V3 }
0.1686 0.2604 0.2242 0.3398 0.00708 k1 u- A9 W/ b+ O1 D8 @
0.0053 0.0406 0.8350 0.1184 0.0007
+ Q/ U- C' U4 J" aobsmat2 =
0.0000 0.2351 0.5738 0.0256 0.1118 0.0186 0.0351' J, Z) S! L# N* g, w
0.0000 0.8270 0.0000 0.0790 0.0256 0.0456 0.0228
{1 z) M; C. L/ ^- V2 C& g3 @ 0.7514 0.0021 0.0011 0.0550 0.1472 0.0432 0.0000, V6 Z( r0 g3 V4 G) z
0.0014 0.4208 0.0447 0.4366 0.0023 0.0887 0.00558 ]# X4 a, x/ \9 m a
0.0000 0.0784 0.3223 0.2014 0.0116 0.1525 0.2338 iteration 1, loglik = -277.738670
w3 o% z8 h7 E' Y; ?7 qiteration 2, loglik = -242.163247
$ D$ I% [ c) K+ d4 j3 ~iteration 3, loglik = -238.321971
5 J! ^) O. L' i6 x" [iteration 4, loglik = -233.166746
* S4 K. B& u4 W( m) kiteration 5, loglik = -225.682259" P' v7 e! G6 `. f1 C; R$ z- A& D6 V
iteration 6, loglik = -214.560296
' k, ^ z* l& B1 ^iteration 7, loglik = -201.1820153 Z) c# S4 V4 W4 u2 |* B$ D# k
iteration 8, loglik = -189.427453
) \0 C6 a, R( b' U& ~, n- Iiteration 9, loglik = -179.156352
5 i( M& \& t! L, Q; [; r: j' fiteration 10, loglik = -171.744096
. z R: p4 F$ `% L% W' b. y7 U: _1 niteration 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
' n7 y( {; N. d2 i6 E- D+ P! Y( n# E" Aprior4 =
0.0000; j9 f& R- r5 N- k
0.9982
; j+ @. P. R. h 0.0004
7 U0 s) b) h1 Z; ~+ {# Q: q 0.0014) z/ s. Q$ Q$ v8 q1 _3 @+ K; }
0.0000
. B' [! W9 i0 u- s& {- g0 m4 H/ }transmat4 =
0.0873 0.5277 0.2799 0.1007 0.0045
2 d, `8 P) \$ h- k 0.0002 0.0000 0.0005 0.0000 0.99944 p. b2 k! y! Q) p2 e) h: r6 N
0.0180 0.0000 0.0118 0.0011 0.9692# N0 r. D0 e3 Q6 B( Y& @/ v
0.0436 0.0226 0.0810 0.0219 0.8310
6 c. J9 l( \9 N) v1 e, a 0.9746 0.0056 0.0003 0.0195 0.0000
, X# n# K6 D$ ]4 G! G3 _obsmat4 =
0.0000 0.2012 0.5080 0.0580 0.1093 0.0465 0.0770
' V( v3 T7 c) C. a* b/ l* R, s% Q 0.7939 0.0001 0.0000 0.0745 0.1277 0.0038 0.0000
1 r9 n# I% R V( N9 ]3 K 0.4120 0.1044 0.0049 0.1736 0.0032 0.3017 0.0001
3 `- x- l1 }8 {4 |1 e$ q! A& N 0.4527 0.0622 0.0637 0.2568 0.0549 0.0295 0.0802
: v6 I% S1 v: y+ a# X" \ 0.0000 0.8172 0.0000 0.0943 0.0270 0.0389 0.0225 * {" z2 r( \: U
data1 = 5 2 4 1 2 2 5 2 3 7 1 6 2
$ p& b+ {# b% nloglik =
-19.2351 . }: @, ], [/ i; G
loglik2 = -21.0715
/ x. s/ ?. {: Ipath =
3 2 5 3 2 1 3 2 1 5 3 2 1 4 Q, L3 {, s6 t, k+ Z9 T; w3 n
path2 = 2 5 1 2 5 1 2 5 1 1 2 5 1 + g+ _" B* n) l
fuhe = 1 |