% ①定义一个HMM并训练这个HMM。
+ r2 q: @' |) O- k! c5 ^& V/ E% ②用一组观察值测试这个HMM,计算该组观察值域HMM的匹配度。' _& Q+ M& c2 V4 U
% 修改:旺齐齐3 W7 C4 d) k# q$ M% l% v( d5 d
% 修改部分为:添加 HMM2 模型。测试一个观察序列更加符合哪个哪个HMM模型。
0 @: v% ]7 t2 H8 R%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % O:观察状态数7 s, P1 J) y/ K7 @
O = 7;
9 m+ a0 m' V h! D3 i b' YO2 = 7;
% R- T7 Q0 K; ~" X5 A) c8 W# Z/ R% Q:HMM状态数
6 a1 w3 V8 E" Q9 F0 tQ = 5;
0 T6 A9 R7 g$ Z' p$ X7 ]! Y2 N3 `, YQ2 = 5;
) S0 D- H# r3 T0 o9 m%训练的数据集,每一行数据就是一组训练的观察值/ T; G+ x4 v- l9 |& e
data=[1,2,3,1,2,2,4,2,3,1,2,7,2;' t; e; {# b6 H" F
1,2,3,6,2,2,1,4,3,1,5,3,1;
6 q9 E2 Y0 N9 K1 X( B" C' P8 n 1,2,3,1,2,5,1,2,4,1,2,3,2;
8 @. i: B o# u, }6 g# A Z 1,2,7,1,2,2,1,2,5,1,2,4,1;
% o7 z; S& `/ Y; f- O' {9 b/ a 5,2,3,3,5,2,1,2,3,1,2,3,6;/ J3 A, Z& |2 P/ e5 E5 y0 E. I
1,2,3,1,2,2,1,6,5,1,2,6,4;
0 n' M3 x, U, @! ^: H6 z/ b6 \% r, D 5,2,3,4,4,2,1,2,3,1,2,5,6;# ~+ P; D2 H H
1,2,6,1,2,2,1,2,3,1,4,3,2;/ J! y2 A, i2 o* Z) p' W, _$ o
1,2,3,4,2,7,1,4,3,1,7,3,3;* v+ x- F3 f h, @; ]
5,2,3,5,2,2,1,2,3,1,2,3,4;
) N4 B# x3 k' K" ~+ | 5,2,4,1,2,2,5,2,3,7,1,6,2;] ( M3 D [: c \# F! @
data2 = [1,2,3,1,2,2,4,2,3,1,2,7,2;1 |" s" [( J. E* s4 N
1,2,3,6,2,2,1,4,3,1,5,3,1;
" o; x( `) X x) N 1,2,3,1,2,5,1,2,4,1,2,3,2;
; g0 {0 M) @4 g* G3 h# M 1,2,7,1,2,2,1,2,5,1,2,4,1;
' P* |2 P! e' r, C7 T 5,2,3,3,5,2,1,2,3,1,2,3,6;
2 T6 a. a8 P8 Q 1,2,3,1,2,2,1,6,5,1,2,6,4; t( ~7 o, } m* D9 s6 u
5,2,3,4,4,2,1,2,3,1,2,5,6;
$ ?6 T. D" [) Q" P 1,2,6,1,2,2,1,2,3,1,4,3,2;7 o9 d, q. ?$ k- J0 M
1,2,3,4,2,7,1,4,3,1,7,3,3;) e+ l3 z8 b9 E
5,2,3,5,2,2,1,2,3,1,2,3,4;
: L4 k5 u) y9 C8 M f" p; ?, o4 D" u 4,2,5,1,2,2,6,2,3,7,1,6,4;] % initial guess of parameters
/ C% |/ }* y; h3 g% 初始化参数
9 _- B* m8 D7 M+ Qprior1 = normalise(rand(Q,1));! i; m9 a3 x8 \+ r$ m+ C: r1 |4 h
transmat1 = mk_stochastic(rand(Q,Q));
) g X/ h/ g* F0 N& |# Sobsmat1 = mk_stochastic(rand(Q,O)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1 A$ j/ A% A: s( a) I% 添加部分
* b5 T7 B6 o c2 a- C' x' B prior3 = normalise(rand(Q2,1));
2 {1 L. t( R: B; l: W4 x8 N0 [ transmat3 = mk_stochastic(rand(Q2,Q2));1 L, c; u" ]! Y+ ~% Z6 t6 ?
obsmat3 = mk_stochastic(rand(Q2,O2));1 y& w' }3 c7 ?- J
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % improve guess of parameters using EM
( p& S: n4 A, R/ f' g2 [' K5 {% 用data数据集训练参数矩阵形成新的HMM模型* |- X) M- J$ \& r, F
[LL, prior2, transmat2, obsmat2] = dhmm_em(data, prior1, transmat1, obsmat1, 'max_iter', size(data,1));! v, h% r3 w$ N1 M9 b+ y5 x, u
% 训练后那行观察值与HMM匹配度* ~9 P0 Q: K% q, M: m# }
LL) \: l) j( B: [- k
% 训练后的初始概率分布
; k6 S$ }8 e" h: Jprior2/ t" f5 _9 j. i1 }! h+ ~* G
% 训练后的状态转移概率矩阵
: n5 x% F( Z ]/ N# ptransmat2
9 B: U( E, d: a) O. p% 观察值概率矩阵
6 @# x; Z7 h% a+ zobsmat2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%* _' Q" M% t& l i2 P: U1 v% t O( N
% 添加部分# y5 q( |+ i" W1 I+ h
[LL2, prior4, transmat4, obsmat4] = dhmm_em(data2, prior3, transmat3, obsmat3, 'max_iter', size(data2,1));
1 ] r ^9 Z( p8 u/ G6 I3 _/ i% \3 B LL2
& B, P ~" Z4 t2 A5 g5 M: ` prior4
9 f$ W* O$ I: M0 h transmat4
/ T7 l C/ I2 \% B+ I" y* D9 u obsmat40 R# `% J0 s* D2 @5 \, C
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % use model to compute log likelihood; R6 a/ l. ?6 H5 E |/ {
% data1=[1,2,3,1,2,2,1,2,3,1,2,3,1]
2 E2 H8 B: R$ E; D6 X- H4 k! Kdata1 = [5,2,4,1,2,2,5,2,3,7,1,6,2]
: [1 _+ X) t2 \, h( r5 Hloglik = dhmm_logprob(data1, prior2, transmat2, obsmat2)& V6 y. N3 | ]6 q7 {5 S( J
% log lik is slightly different than LL(end), since it is computed after the final M step
, U7 }, a3 C! Z% loglik 代表着data和这个hmm(三参数为prior2, transmat2, obsmat2)的匹配值,越大说明越匹配,0为极大值。 % path为viterbi算法的结果,即最大概率path %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%: S& k, Q: V$ G# t1 {& o
% 添加部分
, L' H) i& |5 |/ uloglik2 = dhmm_logprob(data1, prior4, transmat4, obsmat4)/ T, E* Z/ D( g( a
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
) J% m" x, C. l% \5 ]: n0 O% cB = multinomial_prob(data1,obsmat2);9 _. L) @' f3 y. [, e+ R
path = viterbi_path(prior2, transmat2, B)6 q1 A j! M' K
save('sa.mat');
8 [9 H- B* n% A) d6 j& F! v5 f9 @%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9 I# Z& d& i t% g4 M1 b! {1 t0 E! E% 添加部分
7 g9 K* Y; r2 z) Z/ L B2 = multinomial_prob(data1,obsmat4);4 i! d" K( y- j1 S* ^, Q; s8 l
path2 = viterbi_path(prior4, transmat4, B2)9 A* A. k/ R* D
save('sa2.mat');$ W1 P1 T8 h7 r" E) z' k% T
if loglik2 > loglik 7 }6 [0 N3 r& r" y
fuhe = 29 l1 U7 h0 i0 o' S
else
% c+ [( L# i& {3 N8 J9 \9 H fuhe = 1
9 a' C( p6 L; F& }9 m end 0 F( Q! ~8 `9 l9 t% G3 t
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
------ 运行结果 ------ data = 1 2 3 1 2 2 4 2 3 1 2 7 2
, C0 D9 g3 ?* s p3 @/ Y 1 2 3 6 2 2 1 4 3 1 5 3 1$ a" j* [ m+ c" b7 I4 b0 ~
1 2 3 1 2 5 1 2 4 1 2 3 20 n# h! g+ |3 |' t4 |
1 2 7 1 2 2 1 2 5 1 2 4 1
4 ^' z/ k% `8 L" f' T5 Q 5 2 3 3 5 2 1 2 3 1 2 3 6
' g0 X4 z: N' M+ T- c0 o 1 2 3 1 2 2 1 6 5 1 2 6 4
1 N5 l; R. o/ [0 {3 A 5 2 3 4 4 2 1 2 3 1 2 5 6
; e/ [9 @3 f% j* `% j* }/ {' E j 1 2 6 1 2 2 1 2 3 1 4 3 20 J2 g1 Z8 ?' G* a0 J& K3 @ L( {5 y
1 2 3 4 2 7 1 4 3 1 7 3 3
5 e% j* ^8 G3 ?1 ^7 I: X0 {: ? 5 2 3 5 2 2 1 2 3 1 2 3 46 q1 T' T1 h0 m, u- u8 _3 x( S: t
5 2 4 1 2 2 5 2 3 7 1 6 2
0 y0 f5 E9 p K$ I4 g' ~6 \data2 =
1 2 3 1 2 2 4 2 3 1 2 7 2
3 z+ e; b" G: B2 v 1 2 3 6 2 2 1 4 3 1 5 3 1" d% Z0 E- N3 ?4 e0 q* X
1 2 3 1 2 5 1 2 4 1 2 3 2* o0 Y% i6 G; S
1 2 7 1 2 2 1 2 5 1 2 4 1
0 ~' h! G/ w7 a) \6 D/ k 5 2 3 3 5 2 1 2 3 1 2 3 6, C' z4 P4 R( G4 J
1 2 3 1 2 2 1 6 5 1 2 6 4& l) c- r- o8 i% D; d: ?
5 2 3 4 4 2 1 2 3 1 2 5 67 F; m7 j" n4 e+ \
1 2 6 1 2 2 1 2 3 1 4 3 2# r6 g l8 ~0 `; o# I7 K# E
1 2 3 4 2 7 1 4 3 1 7 3 3
0 f2 N1 b- r: f, \, k5 m5 @ 5 2 3 5 2 2 1 2 3 1 2 3 4
: u( i2 O7 B8 l O5 A 4 2 5 1 2 2 6 2 3 7 1 6 4 iteration 1, loglik = -327.1004654 [ c( H" Q. _5 F1 H
iteration 2, loglik = -238.259812
/ g) e h' T* U% P, o$ h$ ^' i ^iteration 3, loglik = -232.962948
# l8 ~/ Q/ W( Eiteration 4, loglik = -223.323891
2 H, ^3 W o+ m6 ]1 Z9 qiteration 5, loglik = -207.6308758 B. ]# r" H. E+ e, e! X' K* f
iteration 6, loglik = -191.0126978 a% A) e0 @2 o
iteration 7, loglik = -178.611546
" p0 x; E8 j; L$ o3 Qiteration 8, loglik = -171.524132
2 I. e, S! i) \' T8 N0 biteration 9, loglik = -168.6265268 \+ {. X, z5 _$ Y3 q( n. I% j
iteration 10, loglik = -167.387057 R6 H4 x9 V8 P# V
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 p: ~, Q4 J4 N9 {prior2 =
0.0000 t/ g. ]$ h' T7 e
0.00004 I! {9 W& b5 u9 `
1.0000
3 ]& ?# y( e& W 0.0000
5 C& E" |9 L1 h: X 0.0000 & ]6 D# q6 `; F, @) m
transmat2 = 0.0138 0.0089 0.7680 0.1060 0.10338 s v. @. k8 ?3 w, f; E+ P" n" b2 d- h
0.7811 0.0000 0.0199 0.0067 0.1923
6 y% K8 S5 E! I1 E1 M 0.0000 0.9936 0.0000 0.0064 0.0000
+ Z, ^% v Y+ e+ e7 p; S 0.1686 0.2604 0.2242 0.3398 0.0070
( m- u' j7 t3 ?1 T 0.0053 0.0406 0.8350 0.1184 0.0007
2 m6 }' b5 }/ m- L* u/ ]; P% V+ }obsmat2 =
0.0000 0.2351 0.5738 0.0256 0.1118 0.0186 0.0351
% _) w0 T8 J3 S( m# E# ^ 0.0000 0.8270 0.0000 0.0790 0.0256 0.0456 0.0228
$ }+ X: n- d% f$ b 0.7514 0.0021 0.0011 0.0550 0.1472 0.0432 0.0000# b1 A$ W: z" z9 n2 X
0.0014 0.4208 0.0447 0.4366 0.0023 0.0887 0.0055
, `! B+ x0 A `1 X, N 0.0000 0.0784 0.3223 0.2014 0.0116 0.1525 0.2338 iteration 1, loglik = -277.7386703 q- O, ^" Z: v$ K
iteration 2, loglik = -242.163247, u$ v; ]& J, L9 c) M8 b
iteration 3, loglik = -238.321971) O8 x% J+ P5 t g. a
iteration 4, loglik = -233.166746 f' f$ P4 s4 O
iteration 5, loglik = -225.682259; x! R; T; V8 v
iteration 6, loglik = -214.560296: e# E. J3 p7 h2 c5 k# s& F5 f
iteration 7, loglik = -201.182015( ?4 {! L9 i9 q
iteration 8, loglik = -189.427453
( p0 E6 Y- f# G* J9 M4 A$ m: D" jiteration 9, loglik = -179.156352
" b+ o* u: `# [& `. W" r5 L) kiteration 10, loglik = -171.744096 W$ }: o$ V# t t! N# E/ g
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
. A, z& `8 h- T9 N% R7 `prior4 =
0.0000+ O: i1 s' ?" \0 g) i! W+ c
0.9982
6 P- c% X. L) I+ M+ V 0.0004
4 A9 U3 s6 e: C1 d+ J+ ] 0.0014
: i! ]4 c) T: A: g 0.0000
& { q. [7 {1 B, s( Rtransmat4 =
0.0873 0.5277 0.2799 0.1007 0.0045
% t/ T' t5 Z" l; @6 Y z! ?* { 0.0002 0.0000 0.0005 0.0000 0.9994
. Z, U# R; A, f 0.0180 0.0000 0.0118 0.0011 0.9692
" C( ?' b2 c6 I$ Q) }* |2 X 0.0436 0.0226 0.0810 0.0219 0.83109 f5 u& n) A! E1 L, y/ S
0.9746 0.0056 0.0003 0.0195 0.0000 4 h! s( x' N1 _) G0 F
obsmat4 = 0.0000 0.2012 0.5080 0.0580 0.1093 0.0465 0.0770
6 ~/ k4 P( m& M, f$ y 0.7939 0.0001 0.0000 0.0745 0.1277 0.0038 0.0000
6 g% O( k _$ N; A6 ^1 h 0.4120 0.1044 0.0049 0.1736 0.0032 0.3017 0.0001
B) X' m* J" W, J1 } F! ] 0.4527 0.0622 0.0637 0.2568 0.0549 0.0295 0.0802& g& X2 e% a* c2 q& Z6 j
0.0000 0.8172 0.0000 0.0943 0.0270 0.0389 0.0225 7 T) ~1 U: a% {8 h$ [ ~; M
data1 = 5 2 4 1 2 2 5 2 3 7 1 6 2 ( w. ]. P* g# v
loglik = -19.2351
" M6 r) E- j2 H% j' lloglik2 =
-21.0715 , B" o, S* Z1 ~2 P4 G1 W6 r6 j
path = 3 2 5 3 2 1 3 2 1 5 3 2 1
7 [0 o9 v" m! C2 A8 {4 _4 W' gpath2 =
2 5 1 2 5 1 2 5 1 1 2 5 1
5 o4 B: K2 h7 k1 ?$ Xfuhe =
1 |