% ①定义一个HMM并训练这个HMM。
- Y' P8 \- U- V" u% ②用一组观察值测试这个HMM,计算该组观察值域HMM的匹配度。( _( o4 i9 H. r+ W$ S
% 修改:旺齐齐9 h. K6 {3 l" r% C' ?4 A; ?
% 修改部分为:添加 HMM2 模型。测试一个观察序列更加符合哪个哪个HMM模型。
5 X1 k/ e5 i5 J6 y%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % O:观察状态数; y5 @* h6 a) S. d: J3 b; M
O = 7;9 m0 u6 a; w0 H8 \) D
O2 = 7;
% }- d6 {7 ^; y5 R5 Z1 f6 M: t% Q:HMM状态数2 _+ A9 J Y5 {3 Z
Q = 5;# r5 f8 `7 q3 u
Q2 = 5;% s) z2 Q7 p5 p$ V% a& X: V
%训练的数据集,每一行数据就是一组训练的观察值8 [9 t$ J/ j9 ~7 K
data=[1,2,3,1,2,2,4,2,3,1,2,7,2;3 ]# f3 J0 f) ~
1,2,3,6,2,2,1,4,3,1,5,3,1;
7 ~* y$ d- ]" x* N6 { 1,2,3,1,2,5,1,2,4,1,2,3,2;
% W% s9 \. e$ C# o 1,2,7,1,2,2,1,2,5,1,2,4,1;, ~' ?. x/ G. M! s/ R/ @
5,2,3,3,5,2,1,2,3,1,2,3,6;
! t. Q1 D& F. k& j 1,2,3,1,2,2,1,6,5,1,2,6,4;' V; m" V+ z- b" I6 `* A0 r2 N
5,2,3,4,4,2,1,2,3,1,2,5,6;4 N1 e ?" a/ {# d7 o) |, g
1,2,6,1,2,2,1,2,3,1,4,3,2;6 n. j( g0 ^: j' E- K* q, ]
1,2,3,4,2,7,1,4,3,1,7,3,3;- {7 @5 L2 o) f2 R( [* a9 _
5,2,3,5,2,2,1,2,3,1,2,3,4;( V' S: M' ]9 e& Y% `+ P
5,2,4,1,2,2,5,2,3,7,1,6,2;] 4 _6 m, A1 h! _
data2 = [1,2,3,1,2,2,4,2,3,1,2,7,2;* `3 g5 b" o( m$ e! F
1,2,3,6,2,2,1,4,3,1,5,3,1;8 g3 r# D( M+ S
1,2,3,1,2,5,1,2,4,1,2,3,2;
3 G7 ]2 a& P. b8 H R 1,2,7,1,2,2,1,2,5,1,2,4,1;" C$ g8 N$ N0 ]: @
5,2,3,3,5,2,1,2,3,1,2,3,6;: W" S; F% s" }+ t+ C9 f) s u0 ]
1,2,3,1,2,2,1,6,5,1,2,6,4;
; ~+ Q$ r$ w; l {# {0 Y$ W, T 5,2,3,4,4,2,1,2,3,1,2,5,6;
7 a5 u$ b) V) m 1,2,6,1,2,2,1,2,3,1,4,3,2;
/ M: D! E1 E8 L8 ] 1,2,3,4,2,7,1,4,3,1,7,3,3;/ b8 z( a% b3 W* F8 h# q
5,2,3,5,2,2,1,2,3,1,2,3,4;
/ b" G- y" r B, c4 ^8 I; a 4,2,5,1,2,2,6,2,3,7,1,6,4;] % initial guess of parameters
/ S9 p$ \. v3 }# ~8 [+ p; v# M% 初始化参数
& u' ^1 G( R" _prior1 = normalise(rand(Q,1));# W* w+ ^! T: D9 C9 c
transmat1 = mk_stochastic(rand(Q,Q));8 i9 _) U: @9 `- @
obsmat1 = mk_stochastic(rand(Q,O)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
) A1 F: w# I7 r5 q% 添加部分
0 }4 ~; r- {; P* N* a# M# J prior3 = normalise(rand(Q2,1));
+ B. V: I4 I* s) _; {$ R6 Y transmat3 = mk_stochastic(rand(Q2,Q2));
1 Z! ?$ j* r/ V# D* m obsmat3 = mk_stochastic(rand(Q2,O2));
( M& x" p) L i: p%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % improve guess of parameters using EM
& n' b- @& `6 P+ k6 s. _- N% 用data数据集训练参数矩阵形成新的HMM模型& U# { ~2 i7 @. \( ~
[LL, prior2, transmat2, obsmat2] = dhmm_em(data, prior1, transmat1, obsmat1, 'max_iter', size(data,1));
4 ]& O9 h A& j/ d0 P3 |5 R0 l% 训练后那行观察值与HMM匹配度
( D$ v+ `8 D7 b, Y! lLL6 g3 O0 X, ^4 o& g3 D
% 训练后的初始概率分布7 t" b, _ }) |$ ~
prior2# L3 u' D4 w2 y5 p
% 训练后的状态转移概率矩阵
7 y) r. z9 R4 L) S; R, R* a' ktransmat2! i! \. m2 F( I; t
% 观察值概率矩阵( C, Y9 ?0 h$ m: }
obsmat2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! {- h v/ D6 @' ?- ?. q% 添加部分
W$ t5 g, c) I: |. w [LL2, prior4, transmat4, obsmat4] = dhmm_em(data2, prior3, transmat3, obsmat3, 'max_iter', size(data2,1));
' G1 |$ }1 T( D9 N8 V5 i LL29 v; ~- H7 Z" J( R& c$ c
prior4
* B6 l+ ^5 J1 D4 Q* B9 ^8 u) G3 [ transmat49 B( L- x% U- D
obsmat4
3 p1 K: `' f7 t) O- o6 L%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % use model to compute log likelihood
) N! \% P0 U* N* T$ w1 X; O. X% data1=[1,2,3,1,2,2,1,2,3,1,2,3,1]
4 @/ s" H9 i2 t: O7 Jdata1 = [5,2,4,1,2,2,5,2,3,7,1,6,2]
, z8 [/ W& l* A9 }5 Floglik = dhmm_logprob(data1, prior2, transmat2, obsmat2)& S' ] v& j. w% v: V0 p
% log lik is slightly different than LL(end), since it is computed after the final M step
% c& O& L( v' Y8 y, F: B% loglik 代表着data和这个hmm(三参数为prior2, transmat2, obsmat2)的匹配值,越大说明越匹配,0为极大值。 % path为viterbi算法的结果,即最大概率path %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
" g# ?, w/ T0 |& k% 添加部分7 r. t; k/ T/ ]+ f) v
loglik2 = dhmm_logprob(data1, prior4, transmat4, obsmat4)& T) a, z# q9 {0 [% w
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 2 r- q0 Z9 A) n% Q I* q& X& ]! _
B = multinomial_prob(data1,obsmat2);
* [- g' u6 w `! [+ r% D. Zpath = viterbi_path(prior2, transmat2, B)
$ ^' Q8 x1 X! N1 _1 y) h7 e1 csave('sa.mat'); 7 z) p! M% P! T- j
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%+ o2 k1 D& _! v, Z' ]
% 添加部分
1 Q& n& [3 |7 ] B2 = multinomial_prob(data1,obsmat4);
+ A# a5 W( V; Y) c; ~5 V/ Y path2 = viterbi_path(prior4, transmat4, B2)
) w: M/ d# z% s2 t& J0 C3 I# h save('sa2.mat');
8 s: `; D; ~5 N) n. X8 A if loglik2 > loglik
7 T* @4 j4 d; H7 ~( i fuhe = 2
# U* W! L V6 m, ^2 \ H7 b1 i else
" y5 H/ p, h( U/ C fuhe = 1; y. G3 c+ W; |% `! `
end
1 ~7 U' h8 n8 o; s! w%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ------ 运行结果 ------ data = 1 2 3 1 2 2 4 2 3 1 2 7 2( |$ L, l' ?. H& N! a7 m S
1 2 3 6 2 2 1 4 3 1 5 3 1
6 r5 E7 B9 e5 C9 y- _: B% W# \ 1 2 3 1 2 5 1 2 4 1 2 3 2
6 w- q+ J6 K- P; u7 {. v. l1 q 1 2 7 1 2 2 1 2 5 1 2 4 1
8 }, e- I5 M& c+ ? 5 2 3 3 5 2 1 2 3 1 2 3 68 q/ t& q5 [; N
1 2 3 1 2 2 1 6 5 1 2 6 4, O# A* O6 U" b- ]5 U' K0 N- f8 I5 n
5 2 3 4 4 2 1 2 3 1 2 5 6
/ x3 `; \3 s* Y: ` 1 2 6 1 2 2 1 2 3 1 4 3 2
# b8 |! v' @8 K4 N$ i/ M( d 1 2 3 4 2 7 1 4 3 1 7 3 3' a/ o2 S! N# x! R9 K: H: _$ k# c
5 2 3 5 2 2 1 2 3 1 2 3 4" _, N6 `* r j" L$ G; X
5 2 4 1 2 2 5 2 3 7 1 6 2 4 V4 \/ Q4 D6 ?) Q3 z& f" }, o
data2 = 1 2 3 1 2 2 4 2 3 1 2 7 2" W2 j4 j, f C+ O
1 2 3 6 2 2 1 4 3 1 5 3 1
0 g7 H$ B% ^" P( S$ U6 A2 p0 w 1 2 3 1 2 5 1 2 4 1 2 3 2
; z7 P/ n$ }$ p6 d2 g; b 1 2 7 1 2 2 1 2 5 1 2 4 19 B, z, k) v9 |8 t& c+ {" W
5 2 3 3 5 2 1 2 3 1 2 3 6
' P) K- b5 z, U a! P 1 2 3 1 2 2 1 6 5 1 2 6 4
$ G3 n) ~- B. @' ` 5 2 3 4 4 2 1 2 3 1 2 5 6# e5 u$ j0 f5 o% T7 z- R. _7 y1 e
1 2 6 1 2 2 1 2 3 1 4 3 2
; q% E: W+ e3 K8 [8 u 1 2 3 4 2 7 1 4 3 1 7 3 3
0 i" p6 L/ R! A! o- D9 }' F" n 5 2 3 5 2 2 1 2 3 1 2 3 4, z9 w5 W* y& n7 q
4 2 5 1 2 2 6 2 3 7 1 6 4 iteration 1, loglik = -327.100465
! O# w# q+ ]5 O5 G# k G$ giteration 2, loglik = -238.259812
! q ~3 w/ F$ h: M- ^iteration 3, loglik = -232.962948
4 I+ E, A# ~* c% Iiteration 4, loglik = -223.323891
* O' x* Q X3 Niteration 5, loglik = -207.630875 P7 ]) v; f% c
iteration 6, loglik = -191.012697- j& _' T0 E) ^& z0 M, W
iteration 7, loglik = -178.611546) g, @2 \7 v7 V3 ^# h! d
iteration 8, loglik = -171.524132" R# h/ Z. X" p7 ~5 r4 u
iteration 9, loglik = -168.626526
6 a9 |* Q# \2 s2 d' Giteration 10, loglik = -167.3870573 j3 {" i& A( M* R# a/ x% P
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 I/ P5 X6 ]+ V, Y$ K
prior2 = 0.0000 _" _: M$ S, ~/ b
0.00007 _5 z, C- R3 Z
1.0000
: n/ n: d8 y" a# E: w- q8 F: v1 x 0.0000% E! o+ }6 q$ d" y* N- d8 B
0.0000 3 H! L8 H* N( v1 `1 V
transmat2 = 0.0138 0.0089 0.7680 0.1060 0.1033) ~. }+ O4 E& y6 l# L
0.7811 0.0000 0.0199 0.0067 0.1923: ]4 Y% Q6 _2 t5 e: D
0.0000 0.9936 0.0000 0.0064 0.00005 }+ L+ W. G# t% Z2 ^
0.1686 0.2604 0.2242 0.3398 0.0070! `; S( h+ l& k: n" v/ X
0.0053 0.0406 0.8350 0.1184 0.0007
6 B4 w( ], z4 @" b# F `* Dobsmat2 =
0.0000 0.2351 0.5738 0.0256 0.1118 0.0186 0.03514 p2 M, U& S/ p& S q4 K* r2 h) n
0.0000 0.8270 0.0000 0.0790 0.0256 0.0456 0.0228* i" f) H. |& R: T3 z# i, u0 O' f
0.7514 0.0021 0.0011 0.0550 0.1472 0.0432 0.00007 I" P1 Y% I! R
0.0014 0.4208 0.0447 0.4366 0.0023 0.0887 0.0055# c- P5 f1 H3 {7 r
0.0000 0.0784 0.3223 0.2014 0.0116 0.1525 0.2338 iteration 1, loglik = -277.738670, @" a8 s( u& ^- u
iteration 2, loglik = -242.163247
6 a: F& ^7 C( witeration 3, loglik = -238.321971
! r; x9 U1 r, c# witeration 4, loglik = -233.166746
3 S5 {+ f" B$ X8 \* J5 r, ~iteration 5, loglik = -225.6822592 G: d; T" {$ L1 Y
iteration 6, loglik = -214.5602961 u6 O/ q1 P4 v6 C" i
iteration 7, loglik = -201.182015
" }5 R1 `/ F* t0 q D6 S* Iiteration 8, loglik = -189.427453! s+ N1 l6 Q0 A! L+ D7 g, n
iteration 9, loglik = -179.156352% k# {/ x+ T: K6 N8 L2 J0 y% a5 D
iteration 10, loglik = -171.744096
6 J- s! W2 ?# L0 ], citeration 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
. T4 B$ g" _8 ?2 s/ o4 ]; Y0 r8 P7 Aprior4 =
0.0000# }5 t! Z, S3 X6 W
0.9982$ C& T, o4 E& G( K6 k8 Y( l
0.0004/ W4 D) \' Q7 D* L7 M
0.0014
+ Y* z6 K' A6 |9 K% W: v7 k 0.0000
+ `" X: N2 Z* U f& Ktransmat4 =
0.0873 0.5277 0.2799 0.1007 0.0045: p8 J. T6 r( z
0.0002 0.0000 0.0005 0.0000 0.9994) W5 W+ Q; G$ m o" I3 |, h- V# J
0.0180 0.0000 0.0118 0.0011 0.9692
+ m4 u9 U4 p* T/ ? 0.0436 0.0226 0.0810 0.0219 0.83109 w) z ?4 D* g) m
0.9746 0.0056 0.0003 0.0195 0.0000 . s8 I0 o* w J' }% b) i U; s' a# G
obsmat4 = 0.0000 0.2012 0.5080 0.0580 0.1093 0.0465 0.0770
) j. o' J7 z' o/ j+ C3 F, g 0.7939 0.0001 0.0000 0.0745 0.1277 0.0038 0.0000+ W, C( T& ^ D# U
0.4120 0.1044 0.0049 0.1736 0.0032 0.3017 0.0001
) g# }& u8 `- T! z W. |' t; x 0.4527 0.0622 0.0637 0.2568 0.0549 0.0295 0.0802( |! N& s) o; q; x" b9 v( C
0.0000 0.8172 0.0000 0.0943 0.0270 0.0389 0.0225 0 B/ r2 N" u# W, p( P% i9 I
data1 = 5 2 4 1 2 2 5 2 3 7 1 6 2 ! g) e( j. j }4 N. q* `* h! T
loglik = -19.2351 8 [% @( r; l: E& p8 O) S
loglik2 = -21.0715
' Z+ R5 c0 j( y+ q) b- n- i' epath =
3 2 5 3 2 1 3 2 1 5 3 2 1 + z9 v7 h0 F: X0 @+ P
path2 = 2 5 1 2 5 1 2 5 1 1 2 5 1
4 e1 U0 i' b) }& ~/ y4 T {! Nfuhe =
1 |