% ①定义一个HMM并训练这个HMM。
' R0 X$ Y' ?. t7 ~$ A. L c% ②用一组观察值测试这个HMM,计算该组观察值域HMM的匹配度。
9 y$ e5 T& J( G, d& w+ U% 修改:旺齐齐* l5 R4 e& \4 ]" X+ _0 [/ q+ Y
% 修改部分为:添加 HMM2 模型。测试一个观察序列更加符合哪个哪个HMM模型。+ R7 l/ A0 a2 E$ D8 ]' c
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % O:观察状态数
6 [ E4 f0 ^( A: d8 WO = 7;6 Q+ t }: A+ C" ~
O2 = 7;
) R3 O) D& Q% f. X! Z% Q:HMM状态数
8 u& V/ b b4 i3 DQ = 5;
- X$ C$ H9 s# s. t( i, r% r mQ2 = 5;
1 S* n; E. ?/ P6 [. X& r# |%训练的数据集,每一行数据就是一组训练的观察值* S. Y! ]3 g3 [8 R1 K3 \
data=[1,2,3,1,2,2,4,2,3,1,2,7,2; G* T3 ^% b! O& N
1,2,3,6,2,2,1,4,3,1,5,3,1;; a& @# K0 _: [0 T# m
1,2,3,1,2,5,1,2,4,1,2,3,2;' U# m' [" n* r( V9 \3 x0 G
1,2,7,1,2,2,1,2,5,1,2,4,1;& T. U( f# K4 y) b% l* }5 i% O
5,2,3,3,5,2,1,2,3,1,2,3,6;
+ s3 x( w0 H) W5 |- P; v 1,2,3,1,2,2,1,6,5,1,2,6,4;" V' J* t& C5 j$ Z6 t
5,2,3,4,4,2,1,2,3,1,2,5,6;
1 j* ?! e& m0 |; P- i+ d 1,2,6,1,2,2,1,2,3,1,4,3,2;
6 Z: V6 ^: L J9 I( G- J 1,2,3,4,2,7,1,4,3,1,7,3,3;
' }- X* N* R! f5 H- C 5,2,3,5,2,2,1,2,3,1,2,3,4;
/ C; ?, ]9 V) b( y' w& p# e, C 5,2,4,1,2,2,5,2,3,7,1,6,2;] " _. g/ c6 i# A$ C
data2 = [1,2,3,1,2,2,4,2,3,1,2,7,2;! h( I3 g: n: B
1,2,3,6,2,2,1,4,3,1,5,3,1;
. d; C# ~7 q8 [ 1,2,3,1,2,5,1,2,4,1,2,3,2;6 v) Z) t9 c3 Z- e
1,2,7,1,2,2,1,2,5,1,2,4,1;
2 c$ X# ]$ m' t 5,2,3,3,5,2,1,2,3,1,2,3,6;8 g! Y6 m8 V8 ]
1,2,3,1,2,2,1,6,5,1,2,6,4;' Y e' q- K) C/ w1 e/ U
5,2,3,4,4,2,1,2,3,1,2,5,6; d" O6 S9 T# P9 Q9 n. a
1,2,6,1,2,2,1,2,3,1,4,3,2;
+ `2 U# v" T; Q+ Y- ?' M0 T* @: h 1,2,3,4,2,7,1,4,3,1,7,3,3;) S' }8 x1 U0 Z% R7 [ ]; ]0 y
5,2,3,5,2,2,1,2,3,1,2,3,4;
+ P* W& x2 {2 H! \& W/ [* T* I 4,2,5,1,2,2,6,2,3,7,1,6,4;] % initial guess of parameters8 A3 J, N* r3 r- c
% 初始化参数5 w" {9 z: p6 {, D1 z% ]; v/ U
prior1 = normalise(rand(Q,1));
& u9 `$ q& f3 g0 v" T: s2 atransmat1 = mk_stochastic(rand(Q,Q));
4 F; ]8 F, r) D! j. e, Bobsmat1 = mk_stochastic(rand(Q,O)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
" k$ B! M- }8 m- `% 添加部分 G' y* u4 Y# C0 h% L
prior3 = normalise(rand(Q2,1));
: n# N# m0 i) t transmat3 = mk_stochastic(rand(Q2,Q2));
; Y$ F3 F+ f9 J+ w obsmat3 = mk_stochastic(rand(Q2,O2));0 Y8 ]5 P: U- a I, Q9 a% N4 c7 x
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % improve guess of parameters using EM
' C# M3 z C2 ]3 T5 N9 V% 用data数据集训练参数矩阵形成新的HMM模型
' X) L( z0 i& f3 y+ f[LL, prior2, transmat2, obsmat2] = dhmm_em(data, prior1, transmat1, obsmat1, 'max_iter', size(data,1));
7 H6 L! O; y/ o& n% 训练后那行观察值与HMM匹配度
2 V7 o: C4 t5 d6 Z- O/ ]8 }LL% J5 e9 v! h* S# H1 P: B0 m
% 训练后的初始概率分布5 a1 T5 v. N5 q" _2 ?& g- k
prior2
4 D7 M0 |& ^" w; Q) n5 H* t% k# @% 训练后的状态转移概率矩阵
, l9 X7 B' ?) a( {. W' }* z3 ktransmat21 g; K3 v2 _9 n( B; R8 X
% 观察值概率矩阵' i* M' |3 V! K6 y
obsmat2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% h$ m" D7 L2 s: A1 m: t/ `9 `% 添加部分: Y: C% I" r2 p
[LL2, prior4, transmat4, obsmat4] = dhmm_em(data2, prior3, transmat3, obsmat3, 'max_iter', size(data2,1));
+ _# O% [( L+ D# k* V9 h LL2
* ]: d9 ?4 `! p$ ?+ A4 d prior4
* z2 r e2 z- u+ C4 e transmat4$ M8 Q& L! a2 i3 M% o+ ~2 K
obsmat4
O" b3 W s3 u%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % use model to compute log likelihood
5 z% D% M3 A3 U! b: N4 o% data1=[1,2,3,1,2,2,1,2,3,1,2,3,1]; o. y- ]+ E" K& ^# s$ v' B
data1 = [5,2,4,1,2,2,5,2,3,7,1,6,2]
4 f8 o5 D+ W/ uloglik = dhmm_logprob(data1, prior2, transmat2, obsmat2)
5 p4 \7 c/ t8 X+ p6 V+ W% log lik is slightly different than LL(end), since it is computed after the final M step
+ d/ p* ~* i! m) T6 z% loglik 代表着data和这个hmm(三参数为prior2, transmat2, obsmat2)的匹配值,越大说明越匹配,0为极大值。 % path为viterbi算法的结果,即最大概率path %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%# f& V. k/ i7 H0 l5 k# `
% 添加部分
/ H' E6 s: b9 Z, U P8 _loglik2 = dhmm_logprob(data1, prior4, transmat4, obsmat4) I7 [' Q$ c+ n
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ ?, a* m5 Q5 bB = multinomial_prob(data1,obsmat2);
* o/ Y* f* a/ X# z5 G3 k% s) \" `path = viterbi_path(prior2, transmat2, B)- T% h! s: b$ f$ r4 l( ~8 ~7 X
save('sa.mat');
, |# J5 d) G# C) u
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 Y) d/ r5 d \3 |6 W; d
% 添加部分
" g6 T7 W# j' H- o. ~9 \: L B2 = multinomial_prob(data1,obsmat4);
" e5 a' n/ x4 g8 D4 W( o path2 = viterbi_path(prior4, transmat4, B2)
, ]: \# Z; t# @% r8 j. X save('sa2.mat');
8 E# v/ S( ~+ \" C. [( Z8 S if loglik2 > loglik & p! W S7 V$ S O. a, b/ c
fuhe = 2
7 z! f% U! Z0 K; D2 R, \5 {6 A else
- K4 |# w0 @& h8 `8 u fuhe = 1
! o) N% X, y. |/ `% A2 O7 w end
/ Z! s' W- c' |%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ------ 运行结果 ------ data = 1 2 3 1 2 2 4 2 3 1 2 7 2
% }6 C/ p& W [5 a* ^ 1 2 3 6 2 2 1 4 3 1 5 3 1
/ j7 H% Z ~6 F8 V) W! u H2 ] 1 2 3 1 2 5 1 2 4 1 2 3 2
5 R/ J1 m) s# O' ^( W% z" a+ ^ 1 2 7 1 2 2 1 2 5 1 2 4 1" k* l* {. B: } v$ `, w, p3 i: t
5 2 3 3 5 2 1 2 3 1 2 3 6
g. }8 x' A& O: l# k5 }, a- Y 1 2 3 1 2 2 1 6 5 1 2 6 4: z; P% t# F& e( ^% F- P- x
5 2 3 4 4 2 1 2 3 1 2 5 6; s' V! Z+ k. e$ [
1 2 6 1 2 2 1 2 3 1 4 3 2' j( S( J) z0 G. a9 H
1 2 3 4 2 7 1 4 3 1 7 3 3
3 M' {/ V7 H- h 5 2 3 5 2 2 1 2 3 1 2 3 4. u8 ]0 y7 @; l |* A
5 2 4 1 2 2 5 2 3 7 1 6 2 . D: D5 U) ~; t1 O
data2 = 1 2 3 1 2 2 4 2 3 1 2 7 2
0 ^9 g0 t8 x5 e2 D6 u1 @ 1 2 3 6 2 2 1 4 3 1 5 3 1+ s; ~1 e( e4 Z! O1 \2 O
1 2 3 1 2 5 1 2 4 1 2 3 23 m) t2 k9 p) n" q( @
1 2 7 1 2 2 1 2 5 1 2 4 1
. b `: }3 }0 H; S0 i3 [ 5 2 3 3 5 2 1 2 3 1 2 3 6
& |: z# e' Z! c# y0 b( z) W 1 2 3 1 2 2 1 6 5 1 2 6 4/ J* k1 {( k: p0 F! ]4 Q! H4 f
5 2 3 4 4 2 1 2 3 1 2 5 6( {# ~- ~/ w+ k. _! L+ | J
1 2 6 1 2 2 1 2 3 1 4 3 29 D# K+ w% ~7 k6 x" G/ }& }: h
1 2 3 4 2 7 1 4 3 1 7 3 3: R+ k7 c( K" d5 U4 _
5 2 3 5 2 2 1 2 3 1 2 3 4
. l9 g1 w# e9 z. L ^0 ? 4 2 5 1 2 2 6 2 3 7 1 6 4 iteration 1, loglik = -327.100465% ]0 @* W% G) U" {, j0 |/ P
iteration 2, loglik = -238.259812
5 U4 J7 d. c, q1 G+ q7 d, Niteration 3, loglik = -232.962948
9 s( p1 W. D. i2 k5 l5 }: Viteration 4, loglik = -223.323891
# A S. H- p4 b+ }1 t8 O* Literation 5, loglik = -207.630875
* k& r2 u9 f0 @iteration 6, loglik = -191.012697
2 K! N! p' \- s, X& uiteration 7, loglik = -178.611546
3 h \6 i: s2 Biteration 8, loglik = -171.5241324 j, p/ P e0 _. h5 J4 _$ v' P3 {
iteration 9, loglik = -168.626526
+ z' o% M+ G7 P- w0 o$ z( U! x6 Riteration 10, loglik = -167.387057
" ~# L; F: x4 ~4 u4 |# yiteration 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 8 K8 o( s" d/ v* s9 X
prior2 = 0.0000- S- _4 }1 b' ~
0.00001 t K. h" L$ j% f. \7 n! s1 c/ O Y
1.0000
* x5 y& a3 C! i0 d3 M+ z( ~# D4 _3 b9 I0 y 0.0000/ a9 I7 p9 d3 K: K5 ?, L
0.0000 4 h7 J' @. B7 d0 U: W9 s2 d& R) f
transmat2 = 0.0138 0.0089 0.7680 0.1060 0.1033
3 g6 Q5 N1 O8 \$ D- F7 v; c 0.7811 0.0000 0.0199 0.0067 0.19230 l5 C7 t9 H9 x+ Y% P% T
0.0000 0.9936 0.0000 0.0064 0.0000( U) N; K$ [+ ~
0.1686 0.2604 0.2242 0.3398 0.0070$ [7 g: {& Y( S/ F
0.0053 0.0406 0.8350 0.1184 0.0007 ) M+ _% |! C: n. Z" D% r. b! J! i
obsmat2 = 0.0000 0.2351 0.5738 0.0256 0.1118 0.0186 0.0351* w' f) J6 n6 O+ v6 q9 s' i
0.0000 0.8270 0.0000 0.0790 0.0256 0.0456 0.0228
+ K' }8 L6 N W" K1 Q& s 0.7514 0.0021 0.0011 0.0550 0.1472 0.0432 0.0000$ P2 a. m; ^; t2 C$ Y. n8 i- b! V
0.0014 0.4208 0.0447 0.4366 0.0023 0.0887 0.0055$ v I" @9 x6 I2 ~/ l" W
0.0000 0.0784 0.3223 0.2014 0.0116 0.1525 0.2338 iteration 1, loglik = -277.738670
" G* {8 }: Y( c- j$ o" Q; C/ B* Ziteration 2, loglik = -242.163247/ T1 w3 Y; l! H* O, `! I
iteration 3, loglik = -238.3219717 f# |, F8 s0 S' J6 N1 Z' S
iteration 4, loglik = -233.166746& P2 ~$ n. a- o0 u, w% ~
iteration 5, loglik = -225.682259
6 Z. g1 S+ V+ q- l5 riteration 6, loglik = -214.560296* l" v, Z0 v. ~( J) c
iteration 7, loglik = -201.182015
; _3 F* c$ A5 d. b+ z' x" ^iteration 8, loglik = -189.427453: @: | h3 ^# t7 S& z0 u
iteration 9, loglik = -179.156352' m. u6 f$ f) ^3 y3 a, C2 ] w
iteration 10, loglik = -171.744096# x W, w& U' @& i$ y- R
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
1 ]) C# N. t/ t5 e. fprior4 =
0.0000' H% q7 o. R, ?6 s/ U
0.9982
E4 E* [" M; U, x7 c 0.0004
8 [, r% Q" D! A# Q% o 0.0014
9 M" f/ b* M4 J0 _ s% p 0.0000
) m& n# H4 T% g. Y, ltransmat4 =
0.0873 0.5277 0.2799 0.1007 0.0045+ {- p: r' @% R' f6 O* U3 e
0.0002 0.0000 0.0005 0.0000 0.9994, Y; J+ S" ?5 i
0.0180 0.0000 0.0118 0.0011 0.9692
1 r! O* A# q9 a7 r4 D1 q/ F 0.0436 0.0226 0.0810 0.0219 0.8310* J( x1 l: H q/ u
0.9746 0.0056 0.0003 0.0195 0.0000 0 D' e: T! }2 F6 j7 ^
obsmat4 = 0.0000 0.2012 0.5080 0.0580 0.1093 0.0465 0.07700 g# c% K( P/ L3 c! I* Y
0.7939 0.0001 0.0000 0.0745 0.1277 0.0038 0.0000
! r% F: p( B8 w/ h) L' m! C& j 0.4120 0.1044 0.0049 0.1736 0.0032 0.3017 0.0001
; s/ [2 b* w" m( @8 ~# A4 U9 u 0.4527 0.0622 0.0637 0.2568 0.0549 0.0295 0.0802! Z H3 w. y+ m2 n6 \( H# T8 e0 q
0.0000 0.8172 0.0000 0.0943 0.0270 0.0389 0.0225
# B! b" q1 E# f" U) ^9 Z1 Vdata1 =
5 2 4 1 2 2 5 2 3 7 1 6 2 ) T8 q/ E; N$ E- c
loglik = -19.2351 0 R2 x- a; J" i7 C# g
loglik2 = -21.0715
7 R9 X1 P6 E8 x* U6 r8 v% Z9 Mpath =
3 2 5 3 2 1 3 2 1 5 3 2 1
* b; H$ ?$ j3 d$ S5 s: w. lpath2 =
2 5 1 2 5 1 2 5 1 1 2 5 1 3 X6 ~ e: \; c2 g: w$ q$ K
fuhe = 1 |