% ①定义一个HMM并训练这个HMM。
7 |; M0 ~* f- `% ②用一组观察值测试这个HMM,计算该组观察值域HMM的匹配度。
: D, q' O( k/ ~7 s' W* s% 修改:旺齐齐
: o! P+ M K8 v! @# |8 C% 修改部分为:添加 HMM2 模型。测试一个观察序列更加符合哪个哪个HMM模型。
) J0 @) b( \. O9 M/ e+ `%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % O:观察状态数! B% G* U/ L, m2 I0 b( T
O = 7;1 k' q6 u6 _6 ~6 c, Y
O2 = 7;! n( Y$ ]' e ^+ Z3 y7 i3 u
% Q:HMM状态数7 h4 e, t0 c/ H" i
Q = 5;
- l; |0 f# ^* z7 \3 X1 XQ2 = 5;
$ |% g# e( `, M2 S# W$ V# q- E%训练的数据集,每一行数据就是一组训练的观察值
; C9 s2 N: L% Bdata=[1,2,3,1,2,2,4,2,3,1,2,7,2;7 e7 k1 E% q# m& O
1,2,3,6,2,2,1,4,3,1,5,3,1;$ O9 f4 y8 h! r4 n! N
1,2,3,1,2,5,1,2,4,1,2,3,2;6 e- D3 b: [! U2 b* O
1,2,7,1,2,2,1,2,5,1,2,4,1;
) z, P# N- W# T7 X; Q 5,2,3,3,5,2,1,2,3,1,2,3,6;
0 m T% X& T# A F" v 1,2,3,1,2,2,1,6,5,1,2,6,4;9 n8 {% S) L3 O4 }% |) @- ^6 E
5,2,3,4,4,2,1,2,3,1,2,5,6;
( I8 C% m7 e0 l 1,2,6,1,2,2,1,2,3,1,4,3,2;8 L) S$ k& o$ U
1,2,3,4,2,7,1,4,3,1,7,3,3;
. _. k E2 O; x: _ 5,2,3,5,2,2,1,2,3,1,2,3,4;
/ z, D) t6 w. B% h0 i) d 5,2,4,1,2,2,5,2,3,7,1,6,2;] 5 R) a* Y7 p3 t. o5 i
data2 = [1,2,3,1,2,2,4,2,3,1,2,7,2;$ N; j0 n4 @1 v! R4 ^4 }3 u
1,2,3,6,2,2,1,4,3,1,5,3,1;" Q$ e- [' x7 T' v, ~
1,2,3,1,2,5,1,2,4,1,2,3,2;
3 x( `; m4 F, `: g 1,2,7,1,2,2,1,2,5,1,2,4,1;3 @3 N! u$ O7 x5 n( f3 T! K7 T
5,2,3,3,5,2,1,2,3,1,2,3,6;- R* {) @2 n& {6 a! D! X
1,2,3,1,2,2,1,6,5,1,2,6,4;
6 R/ w" M. j$ ] }9 v, l X1 z( S 5,2,3,4,4,2,1,2,3,1,2,5,6;
6 l) M( {, U! W! m 1,2,6,1,2,2,1,2,3,1,4,3,2;
( o& E7 z% i8 W0 U7 H" [7 ~ 1,2,3,4,2,7,1,4,3,1,7,3,3;
+ w7 N- z- ?4 l0 o 5,2,3,5,2,2,1,2,3,1,2,3,4;
& {0 G8 W* M/ i) u 4,2,5,1,2,2,6,2,3,7,1,6,4;] % initial guess of parameters
$ W4 h' d1 Q0 M# t- P, Z$ V% 初始化参数2 f' T9 r: K+ A
prior1 = normalise(rand(Q,1));" J D; I& [- E( K
transmat1 = mk_stochastic(rand(Q,Q));8 p+ O! q3 Q: P) f- n
obsmat1 = mk_stochastic(rand(Q,O)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
: A3 q+ \- h7 M: B z( k! p% 添加部分
. R: I$ J$ v* o9 m0 z prior3 = normalise(rand(Q2,1));
+ c4 Y. [- F# Q! b# p transmat3 = mk_stochastic(rand(Q2,Q2));0 w4 C4 }0 c4 `$ I k$ Y6 |) }5 g
obsmat3 = mk_stochastic(rand(Q2,O2));
2 _. |5 X$ U2 p8 I# }" c, N! U%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % improve guess of parameters using EM
: N# k- o' w$ C3 c9 c7 W% f% 用data数据集训练参数矩阵形成新的HMM模型& S) t4 h8 h# m9 H
[LL, prior2, transmat2, obsmat2] = dhmm_em(data, prior1, transmat1, obsmat1, 'max_iter', size(data,1));4 p- K. J/ N5 i$ I- A) ^
% 训练后那行观察值与HMM匹配度' r. r9 l" r1 w6 l: I
LL
0 V+ J9 ]( P: Z6 Z) s! I& }% 训练后的初始概率分布
7 A2 [5 p! K" l0 d9 o$ h* [) b% pprior2* s7 ?, w% w1 S8 Q! t# D# L
% 训练后的状态转移概率矩阵' Y# P# r7 E& y3 f% ?: f. A8 L; Y
transmat26 f4 x# S7 P: }5 k* q9 O, t9 s% n
% 观察值概率矩阵
% H$ j4 T0 q. Z- K5 m9 Pobsmat2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Z9 \: v2 m3 G b9 m
% 添加部分 K O) k) ]) `5 b
[LL2, prior4, transmat4, obsmat4] = dhmm_em(data2, prior3, transmat3, obsmat3, 'max_iter', size(data2,1));5 b5 K! \4 U9 X+ @8 P; q1 F8 g& y
LL2. V2 I" a- _) k" `! R1 f
prior4
8 z, O6 u4 x/ y transmat4( K7 u V: m7 \
obsmat46 d: g* i# W* ~# R) _" l [
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % use model to compute log likelihood
1 P5 U, X$ O3 M+ R0 \3 D" u# b% data1=[1,2,3,1,2,2,1,2,3,1,2,3,1]+ [* T9 i4 C, \. i0 d8 }+ |% ]
data1 = [5,2,4,1,2,2,5,2,3,7,1,6,2]
2 g% H' d6 Z9 a9 M' Ologlik = dhmm_logprob(data1, prior2, transmat2, obsmat2)5 w) R" }, A- y7 P; w
% log lik is slightly different than LL(end), since it is computed after the final M step
* t- T0 ?2 ~! Z' T% loglik 代表着data和这个hmm(三参数为prior2, transmat2, obsmat2)的匹配值,越大说明越匹配,0为极大值。 % path为viterbi算法的结果,即最大概率path %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%- p% Q: X) R7 l. \. ]/ ]
% 添加部分
! @" C8 O9 N" f# R3 Jloglik2 = dhmm_logprob(data1, prior4, transmat4, obsmat4)4 F* u' ` O+ n* q9 L2 L
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% / E9 m" m& V( w* I
B = multinomial_prob(data1,obsmat2);
+ x8 N8 t; E G5 Q6 R- ^path = viterbi_path(prior2, transmat2, B)
: d3 [! b6 g5 f1 `9 D( qsave('sa.mat');
1 d! W! @' ]! w+ e% `0 C& p S%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
) y& f2 s$ t, H0 E/ [% 添加部分( ^5 b% Y1 ?0 A3 }
B2 = multinomial_prob(data1,obsmat4);
5 v7 I+ W" z) _ }, l( U% \7 X, s path2 = viterbi_path(prior4, transmat4, B2)
C4 x0 f d) h, U save('sa2.mat');
, m( S0 ^$ D& A if loglik2 > loglik 0 S: j+ R2 S- a$ E% H& }
fuhe = 29 n; X: e2 R) S8 h. Q4 l
else* m9 r/ e& |4 y/ _) ^
fuhe = 1
9 I2 f" B0 f& c& o+ i N4 u6 y end
! a, j5 E' Z9 m& t" o" w. i( w# o%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
------ 运行结果 ------ data = 1 2 3 1 2 2 4 2 3 1 2 7 2
6 v+ ^! [& e% H. L. N# w4 \/ A 1 2 3 6 2 2 1 4 3 1 5 3 1* X6 N8 V7 v4 V4 e: U: V: @+ j
1 2 3 1 2 5 1 2 4 1 2 3 2
5 _5 H' l( J3 _ 1 2 7 1 2 2 1 2 5 1 2 4 1
/ ]: V o8 B1 `% | 5 2 3 3 5 2 1 2 3 1 2 3 6( N9 H: t! n( m4 X
1 2 3 1 2 2 1 6 5 1 2 6 47 G$ f% V- I3 L4 X2 \: l" _
5 2 3 4 4 2 1 2 3 1 2 5 6, ~, e+ ^, @- m* o6 E; T/ g
1 2 6 1 2 2 1 2 3 1 4 3 2
, {) [# d% y4 l* Z3 t. `, X( L; v 1 2 3 4 2 7 1 4 3 1 7 3 31 E+ i# V& H4 ^8 G
5 2 3 5 2 2 1 2 3 1 2 3 4
1 Z' t% s) a+ _4 N/ u 5 2 4 1 2 2 5 2 3 7 1 6 2
5 p% ?: O7 G6 d5 z: q, `9 _data2 =
1 2 3 1 2 2 4 2 3 1 2 7 2
! i; W) K' o; J1 T$ C; c 1 2 3 6 2 2 1 4 3 1 5 3 1% }+ {/ c% F# N4 f7 ^
1 2 3 1 2 5 1 2 4 1 2 3 2
9 y: E, d+ D+ g* o! U7 U3 w3 h 1 2 7 1 2 2 1 2 5 1 2 4 1
+ A! B; r! K. Q: c 5 2 3 3 5 2 1 2 3 1 2 3 69 @7 G9 Q. U1 T6 C: o* p
1 2 3 1 2 2 1 6 5 1 2 6 4
; B3 A3 e n7 b/ W- \" a5 h 5 2 3 4 4 2 1 2 3 1 2 5 6
1 K7 a" X& N" T3 K7 m' r$ N4 ~ 1 2 6 1 2 2 1 2 3 1 4 3 2; A/ h s, A0 U0 j4 C
1 2 3 4 2 7 1 4 3 1 7 3 3+ _$ X: ?9 T+ s w% e. Z
5 2 3 5 2 2 1 2 3 1 2 3 4* r4 u; ?5 J L. G9 @$ s M
4 2 5 1 2 2 6 2 3 7 1 6 4 iteration 1, loglik = -327.100465. K! ?) ]$ Q. G0 u& e% H; ~
iteration 2, loglik = -238.259812/ [5 e; C$ z& S5 y6 K) M
iteration 3, loglik = -232.962948 s/ J9 t* k7 h: y9 Z
iteration 4, loglik = -223.323891) I, C, U% N3 e/ T+ a$ I; N
iteration 5, loglik = -207.630875
# G( i2 y' j' b' l# x5 viteration 6, loglik = -191.012697
# c C$ A, c! [' Q& Q; f; ~iteration 7, loglik = -178.611546/ A, P% D8 p5 o# f- y; [1 _# @6 g
iteration 8, loglik = -171.524132- y" |5 {2 n# r
iteration 9, loglik = -168.626526
; |3 E. o0 F9 p! h& z0 p8 Citeration 10, loglik = -167.387057
& w* x. ?* y# _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 7 Q, a. t1 {( a5 S; V
prior2 = 0.0000
3 v1 n* c# V+ b" X& Q 0.00001 F( G# m2 I( c; F. q
1.0000* h# ~/ d4 q1 o' p' X
0.00007 B) i }( }& R# Q/ B
0.0000
& x+ l+ ]! [5 w* w: D3 Gtransmat2 =
0.0138 0.0089 0.7680 0.1060 0.10331 y& g/ Q3 ?/ g% b* y
0.7811 0.0000 0.0199 0.0067 0.1923% {1 f; j# y a3 R) |
0.0000 0.9936 0.0000 0.0064 0.0000
, `: W, v* ^* Q3 E 0.1686 0.2604 0.2242 0.3398 0.0070& o+ v+ V) w: n. Z6 ]
0.0053 0.0406 0.8350 0.1184 0.0007
- B; e. K: ^0 Z' m+ @+ C+ }9 Sobsmat2 =
0.0000 0.2351 0.5738 0.0256 0.1118 0.0186 0.0351
" r: O! x) g3 f: K0 d ` 0.0000 0.8270 0.0000 0.0790 0.0256 0.0456 0.0228$ I% T# F6 Z9 w3 B+ k
0.7514 0.0021 0.0011 0.0550 0.1472 0.0432 0.0000; P" U2 s8 G3 z5 B# _4 N
0.0014 0.4208 0.0447 0.4366 0.0023 0.0887 0.0055
% h6 Z" W. a1 Y" u. u9 e1 S# x( A 0.0000 0.0784 0.3223 0.2014 0.0116 0.1525 0.2338 iteration 1, loglik = -277.738670
5 [; h1 p5 O" i6 ^% [9 Jiteration 2, loglik = -242.163247
9 a. T1 K: d. ?0 E2 b# biteration 3, loglik = -238.321971( r, s; D5 k5 t) ]' k/ E- T
iteration 4, loglik = -233.1667468 {- u7 N+ k) ~ `; N+ S0 T
iteration 5, loglik = -225.682259
9 z( f1 ?" H7 t" H+ n9 Piteration 6, loglik = -214.560296
+ L; q. R1 Y" a8 J6 @iteration 7, loglik = -201.182015
$ F4 F, O y5 B1 titeration 8, loglik = -189.427453
" ]1 [$ |' f, ^! s- literation 9, loglik = -179.156352- g( V& E& @. v# e
iteration 10, loglik = -171.744096
k* r7 ^9 u; I' W) c: Eiteration 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 - V6 _* ^7 @* k# T
prior4 = 0.0000
d' T, I$ K" P0 g4 ^7 g8 Z- l 0.9982
* L r8 d1 `( T @ 0.0004( U7 T# l6 [6 A# U$ J
0.0014
) m) A1 O- r7 w/ G- D1 {! V- B3 r 0.0000
" j6 y, X# i7 c. ftransmat4 =
0.0873 0.5277 0.2799 0.1007 0.0045
* w0 @2 k! o( C/ F8 W 0.0002 0.0000 0.0005 0.0000 0.9994
9 z/ Q- s* |( M4 y9 V 0.0180 0.0000 0.0118 0.0011 0.9692* r B9 \+ I# F6 W2 h. X. D
0.0436 0.0226 0.0810 0.0219 0.8310
; [; ]2 [" q3 y. r$ x3 }* x1 G 0.9746 0.0056 0.0003 0.0195 0.0000
+ s# o$ Z; j# q3 h5 fobsmat4 =
0.0000 0.2012 0.5080 0.0580 0.1093 0.0465 0.0770
8 s1 i! r" M% C 0.7939 0.0001 0.0000 0.0745 0.1277 0.0038 0.0000
- I9 e. p( d" D [" A" ?" i1 n 0.4120 0.1044 0.0049 0.1736 0.0032 0.3017 0.0001" H# w4 l- Q. K/ N% l; Q: i
0.4527 0.0622 0.0637 0.2568 0.0549 0.0295 0.08021 h3 a! B$ c; q" T8 F. i
0.0000 0.8172 0.0000 0.0943 0.0270 0.0389 0.0225 & u1 a* Q, m/ N0 \2 x. V' G P
data1 = 5 2 4 1 2 2 5 2 3 7 1 6 2
/ @9 S6 U3 E. y7 nloglik =
-19.2351 * i# i) e9 k! b7 Y {
loglik2 = -21.0715 f. y) V/ V2 B3 Z% F4 {3 G
path = 3 2 5 3 2 1 3 2 1 5 3 2 1
6 l6 I1 i8 w7 t6 B5 Gpath2 =
2 5 1 2 5 1 2 5 1 1 2 5 1 ( w0 e9 N3 F. e
fuhe = 1 |