% ①定义一个HMM并训练这个HMM。
/ O0 r1 [: ~( _( @6 {( h9 ]8 E1 U( y% ②用一组观察值测试这个HMM,计算该组观察值域HMM的匹配度。) g0 v1 W8 g1 F$ ?6 J9 h
% 修改:旺齐齐
* M: r t7 w) P1 }) Q* F1 a* g4 \% 修改部分为:添加 HMM2 模型。测试一个观察序列更加符合哪个哪个HMM模型。) T9 j' l- P8 q" {: ?7 Y
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % O:观察状态数
. ^8 L( m) H- v; U; GO = 7;
9 x0 R, J# g3 `9 q9 u( Q, WO2 = 7;, I( L: r9 O J* d* A; G$ g
% Q:HMM状态数, Q. m- K$ g7 Z0 G8 ?4 x1 v
Q = 5;
) r; K- _. m& q+ _0 I" E, v! mQ2 = 5;
% g) ]. m# u$ S1 f. ]%训练的数据集,每一行数据就是一组训练的观察值
9 i6 Q9 F0 R, l0 g5 Rdata=[1,2,3,1,2,2,4,2,3,1,2,7,2;
/ s( ^9 o" N8 q# T 1,2,3,6,2,2,1,4,3,1,5,3,1;
! Q/ E! V, T- k! x1 F; G 1,2,3,1,2,5,1,2,4,1,2,3,2;2 B' f1 H" b# h) I" t3 z
1,2,7,1,2,2,1,2,5,1,2,4,1;
0 O6 N% Z5 R# b& O9 { 5,2,3,3,5,2,1,2,3,1,2,3,6;- f' \) f' a. B% e9 [5 @, Z" K
1,2,3,1,2,2,1,6,5,1,2,6,4; R+ ~* A- ^5 v1 ~" a- D0 y
5,2,3,4,4,2,1,2,3,1,2,5,6;
. q0 l- d( C9 x, D0 Z 1,2,6,1,2,2,1,2,3,1,4,3,2;
! o% l4 N0 \6 ^( l; i* F, T/ y3 j 1,2,3,4,2,7,1,4,3,1,7,3,3;
. h% U6 ]4 E* a 5,2,3,5,2,2,1,2,3,1,2,3,4;9 A! N f. V* q+ N, Z4 ?8 }
5,2,4,1,2,2,5,2,3,7,1,6,2;] # R8 d d/ h* `' \/ M1 F* v
data2 = [1,2,3,1,2,2,4,2,3,1,2,7,2;3 Q4 S# k* k4 a! _+ s; ^- X
1,2,3,6,2,2,1,4,3,1,5,3,1;
3 H, |: O# h$ t 1,2,3,1,2,5,1,2,4,1,2,3,2;
$ K0 Y n# G7 W1 t3 R6 n6 T6 n 1,2,7,1,2,2,1,2,5,1,2,4,1;* Y' v# |) h- k2 Z: _! k" t7 C0 e
5,2,3,3,5,2,1,2,3,1,2,3,6;; n+ Y& W! a6 i( q7 X
1,2,3,1,2,2,1,6,5,1,2,6,4;
* u% A! Q3 V9 [1 u2 t 5,2,3,4,4,2,1,2,3,1,2,5,6;' X, W7 v& V; L+ \# I
1,2,6,1,2,2,1,2,3,1,4,3,2;3 U9 e! d- ]& _# f8 L% l3 W, r( Z
1,2,3,4,2,7,1,4,3,1,7,3,3;4 S0 ]# w3 h2 c3 l) Y+ c
5,2,3,5,2,2,1,2,3,1,2,3,4;
+ h* E$ A) o6 B) |; O0 N 4,2,5,1,2,2,6,2,3,7,1,6,4;] % initial guess of parameters, X0 S: x+ y9 V0 f1 H$ h. q' }. |& a
% 初始化参数7 H: d. y: _) e6 D
prior1 = normalise(rand(Q,1));
6 t6 K; ]6 N7 e5 @7 Stransmat1 = mk_stochastic(rand(Q,Q));, }8 f7 R8 x( b. D, }8 x) U
obsmat1 = mk_stochastic(rand(Q,O)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
, S" [: B2 U& q* e% 添加部分) g; d! T8 p E, K7 [
prior3 = normalise(rand(Q2,1));
) G# E! Y5 j/ `, T: C% Y transmat3 = mk_stochastic(rand(Q2,Q2));
2 y1 C8 E9 U2 s- x* N7 @6 \ obsmat3 = mk_stochastic(rand(Q2,O2));9 L# z( n) y/ Q. @
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % improve guess of parameters using EM4 L0 @* R2 J3 s" V1 U1 [7 {' u" _
% 用data数据集训练参数矩阵形成新的HMM模型( m9 v- C/ v/ T9 k6 R Y1 l/ F+ B: y
[LL, prior2, transmat2, obsmat2] = dhmm_em(data, prior1, transmat1, obsmat1, 'max_iter', size(data,1));- v" A; d ]- _, B: [
% 训练后那行观察值与HMM匹配度) m6 H9 I. V3 y L0 o7 ?
LL
7 N% p9 O( {" q7 m8 _( N( j4 b% 训练后的初始概率分布" _& z3 w M( B2 X6 M
prior2
6 a ]- I. q& Z( S) y. F* t- ^3 u% 训练后的状态转移概率矩阵
, H. B* H. y( _4 V( i( c' mtransmat2" e: ]" G% ]1 d+ ~
% 观察值概率矩阵) X0 ~+ t/ f; P; J8 y
obsmat2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%' J5 i) X, b# Y% S7 ~
% 添加部分8 |& P6 |9 O8 O! b1 @5 A
[LL2, prior4, transmat4, obsmat4] = dhmm_em(data2, prior3, transmat3, obsmat3, 'max_iter', size(data2,1));% J* u* b3 U7 }
LL2% L& A6 ~* {! u+ e. [( f( l
prior4; f+ P4 Y5 J2 M" D; i7 {3 W9 x3 b6 v
transmat4
* Q: U* h$ _& c2 ~, G& o5 e obsmat4
7 {! u q9 K- R+ \% P%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % use model to compute log likelihood# ^7 M( m: t0 o( Y% [
% data1=[1,2,3,1,2,2,1,2,3,1,2,3,1]
7 p/ M" D: O X, Wdata1 = [5,2,4,1,2,2,5,2,3,7,1,6,2]- a1 r/ I0 v0 h2 F! l
loglik = dhmm_logprob(data1, prior2, transmat2, obsmat2)
3 Z( o* f- W9 [1 S0 `% log lik is slightly different than LL(end), since it is computed after the final M step
' d$ V# h# J! @- \" C5 S3 L% loglik 代表着data和这个hmm(三参数为prior2, transmat2, obsmat2)的匹配值,越大说明越匹配,0为极大值。 % path为viterbi算法的结果,即最大概率path %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%. K8 _# x( u; U. x6 m+ }
% 添加部分( X1 D2 y" O+ I" h
loglik2 = dhmm_logprob(data1, prior4, transmat4, obsmat4); u1 g. {4 T* O: ]$ R9 q$ {: b( t
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% : T; `" Y$ {7 m6 b
B = multinomial_prob(data1,obsmat2);
3 h P& i' D6 Wpath = viterbi_path(prior2, transmat2, B)
' e+ \ k0 H9 A7 X& z- Nsave('sa.mat');
5 y" E( t$ `% v& w9 P9 @% T1 z%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
' o+ `/ n+ L* T$ ]% 添加部分
# N8 L* b8 d* d& V8 u7 j B2 = multinomial_prob(data1,obsmat4);
6 K: _& V0 \: G2 S2 r" Q$ r path2 = viterbi_path(prior4, transmat4, B2)
, W8 ]1 b J# I7 S% g: N U- G2 @* P save('sa2.mat');
9 U( a& K. X& B& {" ^3 F if loglik2 > loglik
5 u) q( `% X( y+ H+ h8 [ fuhe = 2
9 }* M! I+ r/ K' S else2 u6 w2 z+ G6 E3 d
fuhe = 1& t- D" z5 ]; @; B2 y. W, s% @
end / S+ Q; l8 X7 [: w* j, h# q2 P
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
------ 运行结果 ------ data = 1 2 3 1 2 2 4 2 3 1 2 7 2
1 ?5 x+ J2 i( e2 A 1 2 3 6 2 2 1 4 3 1 5 3 1
+ O9 t0 a6 \$ Y 1 2 3 1 2 5 1 2 4 1 2 3 2- V- R1 L4 p9 d4 i2 E) E
1 2 7 1 2 2 1 2 5 1 2 4 1
1 J$ s% D0 V$ Z" D8 r% S$ z 5 2 3 3 5 2 1 2 3 1 2 3 6
4 z5 w# s" N4 E# [5 m 1 2 3 1 2 2 1 6 5 1 2 6 4
) H( H# N/ ~$ p3 D 5 2 3 4 4 2 1 2 3 1 2 5 65 F$ Q( {% q7 R9 \5 Q1 _; m8 f
1 2 6 1 2 2 1 2 3 1 4 3 2
& b& q* P% p7 d$ |9 d' X. H: Z- H 1 2 3 4 2 7 1 4 3 1 7 3 3. M" p2 n" O5 B* T
5 2 3 5 2 2 1 2 3 1 2 3 4
3 C1 o, ~3 @# `9 I. j8 \; I 5 2 4 1 2 2 5 2 3 7 1 6 2
$ c4 i+ A% t8 o$ hdata2 =
1 2 3 1 2 2 4 2 3 1 2 7 2
0 p7 y* {: B3 f" } 1 2 3 6 2 2 1 4 3 1 5 3 16 N) c z2 n2 g2 j$ x% s, h! R
1 2 3 1 2 5 1 2 4 1 2 3 2) ~9 B" k' R* t+ U) t+ `5 {
1 2 7 1 2 2 1 2 5 1 2 4 16 _" x, z c D5 Y8 x$ c
5 2 3 3 5 2 1 2 3 1 2 3 62 F4 o, c+ S- _; T" _6 N7 z3 x
1 2 3 1 2 2 1 6 5 1 2 6 4
0 a7 c& i9 x6 M' j @ 5 2 3 4 4 2 1 2 3 1 2 5 6
" `% w" g% N7 L5 r" Z7 U 1 2 6 1 2 2 1 2 3 1 4 3 2
5 N, M" R" b0 ~, K# V" | 1 2 3 4 2 7 1 4 3 1 7 3 30 [3 E% }/ P7 { |- H8 D
5 2 3 5 2 2 1 2 3 1 2 3 4
" s" t' }7 H6 i R 4 2 5 1 2 2 6 2 3 7 1 6 4 iteration 1, loglik = -327.1004659 E& k7 v) h7 c* i' n, F
iteration 2, loglik = -238.259812
! g4 F! K4 R: N# |# K* l9 i: R6 Eiteration 3, loglik = -232.962948
- h$ _$ V# h# W" fiteration 4, loglik = -223.323891
9 w2 I5 Z/ N9 R& U: \iteration 5, loglik = -207.6308756 s( r- A4 h' J8 S( ]/ [
iteration 6, loglik = -191.012697" `9 \3 D' T% r# t2 d" W7 C
iteration 7, loglik = -178.611546: f; Q8 {7 K l! f4 M4 T4 T6 {
iteration 8, loglik = -171.524132" N, @% X7 {% z. E
iteration 9, loglik = -168.6265264 V0 A* {! R3 x3 t* T- x' b' W
iteration 10, loglik = -167.387057
. B) q' R) q( ]7 }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 2 H j6 m4 ]3 [, s: w2 y
prior2 = 0.0000
( X8 g( e+ G+ V- l 0.0000
( j" @; t0 A. m1 E( {5 T0 f# ^# `* } 1.0000) n" t) ?0 ] U7 B! K( a: r
0.0000) [' M4 d/ i# r6 e$ y9 [7 @
0.0000
2 @2 W) t. B8 @; K, a' ~ wtransmat2 =
0.0138 0.0089 0.7680 0.1060 0.1033/ S1 A3 f, Z# m( r8 W8 M* i# Q* O1 d
0.7811 0.0000 0.0199 0.0067 0.1923$ }4 G% `/ x3 {) A. S9 c5 U: J
0.0000 0.9936 0.0000 0.0064 0.0000, ~" m V* `4 {& M
0.1686 0.2604 0.2242 0.3398 0.0070
( p# w& y" y$ b 0.0053 0.0406 0.8350 0.1184 0.0007 4 S/ D1 J8 x/ G2 w
obsmat2 = 0.0000 0.2351 0.5738 0.0256 0.1118 0.0186 0.0351! E/ ]0 L1 _: L Q8 |8 ?3 s/ `
0.0000 0.8270 0.0000 0.0790 0.0256 0.0456 0.0228
5 w4 [; o% i- s W& u' _ 0.7514 0.0021 0.0011 0.0550 0.1472 0.0432 0.00003 B7 {2 g+ t0 v( }( U
0.0014 0.4208 0.0447 0.4366 0.0023 0.0887 0.0055
0 u* l, \/ ]2 @7 B* ~ 0.0000 0.0784 0.3223 0.2014 0.0116 0.1525 0.2338 iteration 1, loglik = -277.738670
, D( f% N7 Z, uiteration 2, loglik = -242.163247
$ K7 K" I) V T2 n( v, Z' Yiteration 3, loglik = -238.321971
% i9 P$ A: n- m3 L8 u2 Eiteration 4, loglik = -233.166746
' {/ \& M7 b. L9 A! Qiteration 5, loglik = -225.682259/ C; w( z; ?1 q
iteration 6, loglik = -214.560296 z% p+ O8 M2 X5 p* |! B! U
iteration 7, loglik = -201.182015
* M% }6 F0 _) J, q( A/ l- r, a- _- oiteration 8, loglik = -189.4274532 q6 c( Z X* z, U3 n' h( c9 T
iteration 9, loglik = -179.156352* D4 [. I- z& c! l
iteration 10, loglik = -171.744096
) X; k7 R! \" N" G% W3 h' _; ]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 7 I2 d6 Z) x$ b/ I+ V* o) l" _! y
prior4 = 0.0000( M! R( @ F" i! Z! D; j; u% ?$ S
0.9982# Q8 y8 Y- H3 t! I" L1 L
0.0004
! P9 d3 ^% [! ~5 @. B: N8 R 0.00141 p) g( L! C! V$ W" b
0.0000 : Y" J/ C( ^) ~8 b" x
transmat4 = 0.0873 0.5277 0.2799 0.1007 0.0045: S2 {: ]5 p: y! |& W& V
0.0002 0.0000 0.0005 0.0000 0.9994+ M) J& P7 R7 t' P% u
0.0180 0.0000 0.0118 0.0011 0.9692
, Y) y, Z* x, B( \/ y6 T) \ 0.0436 0.0226 0.0810 0.0219 0.8310
1 ~7 U6 p* S3 V7 q( N 0.9746 0.0056 0.0003 0.0195 0.0000
+ \2 a# I# `/ y8 zobsmat4 =
0.0000 0.2012 0.5080 0.0580 0.1093 0.0465 0.0770' ^+ q; @" M- \/ Q
0.7939 0.0001 0.0000 0.0745 0.1277 0.0038 0.00000 u; ]; ?7 \% B
0.4120 0.1044 0.0049 0.1736 0.0032 0.3017 0.0001
) ?$ }9 i0 U% i& z5 _ 0.4527 0.0622 0.0637 0.2568 0.0549 0.0295 0.0802
# q: I" u" P6 D, H; z 0.0000 0.8172 0.0000 0.0943 0.0270 0.0389 0.0225 " Y$ s4 |) A* k; o8 w( c5 O
data1 = 5 2 4 1 2 2 5 2 3 7 1 6 2 : c. K& k: c, B( }: ^
loglik = -19.2351
: U1 D7 i0 J4 |2 H" f/ j5 ologlik2 =
-21.0715
& Q) |' E7 @; b8 _path =
3 2 5 3 2 1 3 2 1 5 3 2 1
0 I) ]2 x2 `! bpath2 =
2 5 1 2 5 1 2 5 1 1 2 5 1 9 T& i, I9 P8 O: H8 c3 S/ @: C5 z
fuhe = 1 |