% ①定义一个HMM并训练这个HMM。: E8 p- _5 ]/ L
% ②用一组观察值测试这个HMM,计算该组观察值域HMM的匹配度。
; a6 U1 q; `' A/ s% 修改:旺齐齐( a# E1 \- w- x: s/ l+ S
% 修改部分为:添加 HMM2 模型。测试一个观察序列更加符合哪个哪个HMM模型。
1 l7 O& f D( i R7 w%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % O:观察状态数
: l1 c8 p6 W" j( ^$ x4 ]O = 7;
2 I# v+ D0 D0 U% }& tO2 = 7;
, P% H8 K' \0 [9 S. h% Q:HMM状态数0 i# `: G1 d4 L! }; b! A% \
Q = 5;" q) C- X0 G, x% _. D+ K
Q2 = 5;
, T; ~3 x! A, r# ?! ~' [2 n2 V%训练的数据集,每一行数据就是一组训练的观察值: B7 B$ ?( d) g( l
data=[1,2,3,1,2,2,4,2,3,1,2,7,2;' I) ^! _- X+ N
1,2,3,6,2,2,1,4,3,1,5,3,1;1 q6 L3 \) h/ ]8 [, w4 }
1,2,3,1,2,5,1,2,4,1,2,3,2;
$ H* W# X6 k, d+ a- k8 U 1,2,7,1,2,2,1,2,5,1,2,4,1;
$ F3 F5 Q( l$ _1 B! \6 l 5,2,3,3,5,2,1,2,3,1,2,3,6;
( y4 o! h* d1 K* {% j; y( O ] h7 F 1,2,3,1,2,2,1,6,5,1,2,6,4;! k1 y& i- z8 u2 [
5,2,3,4,4,2,1,2,3,1,2,5,6;
8 |. P( Y: \2 k f _ 1,2,6,1,2,2,1,2,3,1,4,3,2;+ m+ @6 o, V8 [; r3 O* n+ Z. t( g
1,2,3,4,2,7,1,4,3,1,7,3,3;& J& N, J* ]. e: O9 K8 c
5,2,3,5,2,2,1,2,3,1,2,3,4;
+ R+ W1 R: X) t; L! V5 V 5,2,4,1,2,2,5,2,3,7,1,6,2;]
: q+ \7 f3 @- B7 q& [5 ?: b% E data2 = [1,2,3,1,2,2,4,2,3,1,2,7,2;& D+ r$ R+ P( I
1,2,3,6,2,2,1,4,3,1,5,3,1;. q1 q/ n# K; Z% p; |
1,2,3,1,2,5,1,2,4,1,2,3,2; t* t; \1 n0 B- O$ q9 h' Y
1,2,7,1,2,2,1,2,5,1,2,4,1;
* k2 X! \- t7 D. O 5,2,3,3,5,2,1,2,3,1,2,3,6;
: Z" B; g. E- M, x- k- Y T& d; h3 ^ 1,2,3,1,2,2,1,6,5,1,2,6,4;. N! f. R4 B. v5 ]1 X {& e
5,2,3,4,4,2,1,2,3,1,2,5,6;
) h. l( j" [. y8 [4 b; i 1,2,6,1,2,2,1,2,3,1,4,3,2;
; m# f; ]' `7 V0 S9 ?7 {6 p 1,2,3,4,2,7,1,4,3,1,7,3,3;
- t4 Q' B. O. _) c2 b3 X 5,2,3,5,2,2,1,2,3,1,2,3,4;, o I1 l: k: j! f( W
4,2,5,1,2,2,6,2,3,7,1,6,4;]
% initial guess of parameters
/ U* S4 h+ {6 q% 初始化参数
% d- m; _" i$ G$ @- D7 o/ l, sprior1 = normalise(rand(Q,1));
" m& ?3 Q7 k1 z- t* W( I& Ktransmat1 = mk_stochastic(rand(Q,Q));
8 e3 W) [& D9 t5 L' h; Pobsmat1 = mk_stochastic(rand(Q,O)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% L" N# O0 M% c! c2 Y/ Q
% 添加部分& a! c, r2 E! j
prior3 = normalise(rand(Q2,1));, C" C: ]. Y4 X; ]3 H, Q& Y3 R
transmat3 = mk_stochastic(rand(Q2,Q2));
( D! A+ f7 R- t obsmat3 = mk_stochastic(rand(Q2,O2));! I9 N; f: X/ l" P5 Z2 g! O
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % improve guess of parameters using EM0 ]5 _6 |) N. f5 I+ r
% 用data数据集训练参数矩阵形成新的HMM模型
& n9 b8 u( I% t+ g. P) k[LL, prior2, transmat2, obsmat2] = dhmm_em(data, prior1, transmat1, obsmat1, 'max_iter', size(data,1));5 C+ S: B4 t; e& H
% 训练后那行观察值与HMM匹配度5 A4 V7 p D+ y# V! X
LL) l, k" i1 i' j- e
% 训练后的初始概率分布
4 J9 G" ~0 \% {; yprior2. S3 n) r) O! j1 p# Y* h
% 训练后的状态转移概率矩阵" f7 i$ ? r' R" t! {
transmat2
. R# r) L: a6 P) L& P% 观察值概率矩阵
( Z& G* u7 O$ M7 x# t/ E7 X5 Uobsmat2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 c" K9 ?: ~0 u( ~+ E( M
% 添加部分
3 c8 S! q( E; w [LL2, prior4, transmat4, obsmat4] = dhmm_em(data2, prior3, transmat3, obsmat3, 'max_iter', size(data2,1));, O. B" H0 d0 s/ T
LL2
. U# D8 s R$ p& g+ q% F" P, Z j9 k prior4
# N* \( ]2 C4 o B" j, t) ? transmat4 E' S7 [! e( V: X* g( Z+ C
obsmat4
# ?8 M& O. E' f/ E$ N) T# ~& j%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % use model to compute log likelihood" s" i% _. H- e0 y: v7 q
% data1=[1,2,3,1,2,2,1,2,3,1,2,3,1]) J% D7 A9 h/ S1 d/ M, l
data1 = [5,2,4,1,2,2,5,2,3,7,1,6,2]
/ T; K5 D$ F0 J4 c% L4 j ]loglik = dhmm_logprob(data1, prior2, transmat2, obsmat2)4 L8 d; O9 Y, d' h4 y
% log lik is slightly different than LL(end), since it is computed after the final M step
2 x3 K3 B1 R" U6 K% loglik 代表着data和这个hmm(三参数为prior2, transmat2, obsmat2)的匹配值,越大说明越匹配,0为极大值。 % path为viterbi算法的结果,即最大概率path %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 z+ F( O3 L$ ^- i
% 添加部分& O6 A3 R# S& E: ?
loglik2 = dhmm_logprob(data1, prior4, transmat4, obsmat4)3 L# v6 ], v0 X- ~% w
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
$ q3 C7 O# E1 |/ q# g( T: D8 W+ @B = multinomial_prob(data1,obsmat2);
9 _$ _! ?3 u9 f- W1 O8 b" upath = viterbi_path(prior2, transmat2, B)
# ?+ Z9 q" ~- D% Y4 i' psave('sa.mat');
' b; l& C' |+ v* o7 g
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%. E- n, Z9 M" S$ k+ x
% 添加部分
' h5 B4 g+ z; E4 [0 n B2 = multinomial_prob(data1,obsmat4);
% W7 S0 ?% t M. O$ U4 M path2 = viterbi_path(prior4, transmat4, B2)
8 f" Y/ i! [+ H; ~! ^3 Y save('sa2.mat');4 V' m/ X" j, o& n
if loglik2 > loglik
% d$ k9 s2 ~( R! i) S fuhe = 2& b1 P* K; z4 r4 f* M# [; ^
else
2 ^3 O$ {: y" ` d fuhe = 1! L9 F% I6 [1 I5 U( E
end 2 W7 v {+ W$ p6 d2 n
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ------ 运行结果 ------ data = 1 2 3 1 2 2 4 2 3 1 2 7 2- ?. z7 B- G+ O
1 2 3 6 2 2 1 4 3 1 5 3 1
: l2 x& C+ z% v' A* ~ 1 2 3 1 2 5 1 2 4 1 2 3 2% A8 B; k" A4 c
1 2 7 1 2 2 1 2 5 1 2 4 1! J- J& @1 u# o, C3 Q6 o
5 2 3 3 5 2 1 2 3 1 2 3 6
. e5 B" }4 u9 t, I @ 1 2 3 1 2 2 1 6 5 1 2 6 4
' n9 G' y" R' i L6 B 5 2 3 4 4 2 1 2 3 1 2 5 6: ^# f, ]' w$ j& C5 X& A# K
1 2 6 1 2 2 1 2 3 1 4 3 22 R7 d* e; o: m8 O
1 2 3 4 2 7 1 4 3 1 7 3 3
. K. z" E! x0 C, {9 |7 W 5 2 3 5 2 2 1 2 3 1 2 3 4
# F0 A" J* T' m" X- w 5 2 4 1 2 2 5 2 3 7 1 6 2
2 Z+ a) q$ X3 H3 K9 zdata2 =
1 2 3 1 2 2 4 2 3 1 2 7 2
V" H+ _6 i) I. l 1 2 3 6 2 2 1 4 3 1 5 3 16 m( P* t8 v1 M
1 2 3 1 2 5 1 2 4 1 2 3 22 ]9 Y4 K8 c/ Z& Q `% m
1 2 7 1 2 2 1 2 5 1 2 4 15 G& {- Z; i; g3 a( Z3 Z
5 2 3 3 5 2 1 2 3 1 2 3 6
" s* j8 b- c) Q: l2 | V 1 2 3 1 2 2 1 6 5 1 2 6 4
1 E% y! z- u- q1 Y' f3 e% s5 @ 5 2 3 4 4 2 1 2 3 1 2 5 6, o& A8 K) I% V- T2 |7 ~! R4 q
1 2 6 1 2 2 1 2 3 1 4 3 2
) i" s9 e3 u' g/ V) S$ a 1 2 3 4 2 7 1 4 3 1 7 3 3
) I$ e/ k% G: w, n+ F 5 2 3 5 2 2 1 2 3 1 2 3 4
8 a( r5 P3 c7 [1 p$ m4 L" ]* S 4 2 5 1 2 2 6 2 3 7 1 6 4 iteration 1, loglik = -327.100465
( @% h2 o% k! {7 [; Ziteration 2, loglik = -238.2598127 b c2 e7 E& f
iteration 3, loglik = -232.962948+ i! [% y( Q8 j& u! t5 m
iteration 4, loglik = -223.323891
- {; {2 J$ l- V- F: O/ n, B/ Literation 5, loglik = -207.630875& X$ A! f. D! G, w6 \
iteration 6, loglik = -191.012697
, O4 I$ U( l7 S9 n0 I; niteration 7, loglik = -178.611546# l. }' x. Y+ ^1 L
iteration 8, loglik = -171.524132
) ]6 Q+ Y' x" [ N4 X9 b/ n) witeration 9, loglik = -168.626526& S- k1 ]0 u8 p& Q. j
iteration 10, loglik = -167.387057
$ e. V) H# ~* B& @- oiteration 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
4 X- Z. y' s; q7 o. C4 fprior2 =
0.0000& c1 a1 s: ^" o0 x( F5 o/ ~
0.0000& ?' Y) q9 V9 y; _% R
1.00002 p0 ?9 ?3 E9 O& U% {" \
0.0000
+ u2 w( ^/ B$ }( w- L! q5 ~8 E9 b3 Z- R: o 0.0000 3 @2 c: ~: V. Q
transmat2 = 0.0138 0.0089 0.7680 0.1060 0.1033
% W. p) g) A" C I& C4 _ 0.7811 0.0000 0.0199 0.0067 0.1923, D1 x% @1 J) j r% D' F# a
0.0000 0.9936 0.0000 0.0064 0.0000
* S6 |$ s, a4 G* n0 O$ E 0.1686 0.2604 0.2242 0.3398 0.0070
2 F% V2 y' @& @ 0.0053 0.0406 0.8350 0.1184 0.0007 ) X! N: U- R' V8 w, h* E
obsmat2 = 0.0000 0.2351 0.5738 0.0256 0.1118 0.0186 0.0351
" }# o3 R: R6 E7 B& D6 m 0.0000 0.8270 0.0000 0.0790 0.0256 0.0456 0.0228- _& l( {8 j; z+ f! O9 u! _& S# k
0.7514 0.0021 0.0011 0.0550 0.1472 0.0432 0.0000
! i- h( g% m) p* @+ o 0.0014 0.4208 0.0447 0.4366 0.0023 0.0887 0.0055
! z- x1 n: ]6 l3 J1 n7 D$ I `" _/ d 0.0000 0.0784 0.3223 0.2014 0.0116 0.1525 0.2338 iteration 1, loglik = -277.738670
+ ?( H" K W) }) i6 q* {4 h. Iiteration 2, loglik = -242.163247( Z: T9 f, J& E7 u* \" Z
iteration 3, loglik = -238.321971
, @' |' c- z8 V8 L- ~/ D, O! d4 Citeration 4, loglik = -233.166746" J4 ?) R6 i( n; s. K8 U2 D8 d
iteration 5, loglik = -225.682259# l: { D2 @. i( x! B- [7 R
iteration 6, loglik = -214.560296* u7 S: \+ |% q, Q' a3 O& b# M( i
iteration 7, loglik = -201.182015
% A# Z0 l* {( `5 p/ n+ v1 literation 8, loglik = -189.4274536 K: S: {8 J7 b: a$ p
iteration 9, loglik = -179.156352' _; \; z, Q! ?7 h0 _
iteration 10, loglik = -171.744096- R: c% ^% w8 T* s q
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 % P5 ~' A+ X# }% ~8 F1 x
prior4 = 0.0000. w6 e8 X1 e0 H0 q% f @( v
0.9982
. ` M. y7 {$ S0 x% a7 [ 0.00044 ?4 }0 i. B0 o v
0.0014
7 L4 D) H: |/ r- } 0.0000 - G e0 z8 {1 r& `7 h
transmat4 = 0.0873 0.5277 0.2799 0.1007 0.0045
! w- M3 Q" _. y7 Z P# y2 y8 ]0 d 0.0002 0.0000 0.0005 0.0000 0.9994* F2 s" a/ V9 m# H4 N' O
0.0180 0.0000 0.0118 0.0011 0.9692
4 D; C) t) Z0 ?7 g2 X 0.0436 0.0226 0.0810 0.0219 0.8310
$ [; u' Z4 Y, x& q1 f 0.9746 0.0056 0.0003 0.0195 0.0000 7 ^9 |7 c% o0 H5 }9 n9 {
obsmat4 = 0.0000 0.2012 0.5080 0.0580 0.1093 0.0465 0.0770, I3 w: P/ C) m$ ~
0.7939 0.0001 0.0000 0.0745 0.1277 0.0038 0.00008 W9 V- T" s' M/ @1 S6 j v% a7 B
0.4120 0.1044 0.0049 0.1736 0.0032 0.3017 0.0001
9 u1 ], R9 w P/ g3 S% }( s4 ]6 G 0.4527 0.0622 0.0637 0.2568 0.0549 0.0295 0.0802" E- g' g) Q! I8 H W. m. f* Z, P
0.0000 0.8172 0.0000 0.0943 0.0270 0.0389 0.0225
. g/ H5 z! ?( R% c6 Wdata1 =
5 2 4 1 2 2 5 2 3 7 1 6 2 0 Q# a8 O5 j( q$ {- F/ f2 a
loglik = -19.2351
' S3 T$ J1 L& J8 o1 J& Nloglik2 =
-21.0715 + i4 r( w9 j2 _. v6 X
path = 3 2 5 3 2 1 3 2 1 5 3 2 1
! y7 l3 y) v( spath2 =
2 5 1 2 5 1 2 5 1 1 2 5 1
i/ U/ c7 \ \" S. B9 h# W2 Yfuhe =
1 |