% ①定义一个HMM并训练这个HMM。% F/ c% G$ }+ r1 v7 t6 x' y7 m" R" w
% ②用一组观察值测试这个HMM,计算该组观察值域HMM的匹配度。
6 ]" J! V/ d* J. k7 J5 p. I% 修改:旺齐齐/ S* s7 s0 n9 k7 A+ e, k" q
% 修改部分为:添加 HMM2 模型。测试一个观察序列更加符合哪个哪个HMM模型。
# h. N# v: ] C" f! G* b9 M8 z A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % O:观察状态数7 P# t/ Y' Z3 S
O = 7;+ G- K' E; C" o$ l
O2 = 7;/ Y( ]1 ], D4 X* H9 [
% Q:HMM状态数
; i2 M: e7 M8 m3 C u% KQ = 5;
% I! r% P- _# o+ ~/ C0 ]& n3 hQ2 = 5;& ~$ f7 v4 D" t6 \4 `3 z' j) b
%训练的数据集,每一行数据就是一组训练的观察值
8 _( J1 y! `" _. m0 d; N% Fdata=[1,2,3,1,2,2,4,2,3,1,2,7,2;8 Q6 [( J5 q8 d$ c* S1 `' l
1,2,3,6,2,2,1,4,3,1,5,3,1;$ ^ `& B/ q3 j0 \5 h
1,2,3,1,2,5,1,2,4,1,2,3,2;4 Z/ ^- y( X: V8 O0 V
1,2,7,1,2,2,1,2,5,1,2,4,1;
) i& h$ p% l% O 5,2,3,3,5,2,1,2,3,1,2,3,6;) d% j2 q+ P z9 H
1,2,3,1,2,2,1,6,5,1,2,6,4;
/ x& ~5 v) p9 N 5,2,3,4,4,2,1,2,3,1,2,5,6;
8 U, ?* a- l6 L/ j- m 1,2,6,1,2,2,1,2,3,1,4,3,2;
% P8 x u% x4 {% d 1,2,3,4,2,7,1,4,3,1,7,3,3;
4 e/ H% L$ L2 o) x9 N; ^' Y. D! J# i 5,2,3,5,2,2,1,2,3,1,2,3,4;
- a6 ^8 j% f) g 5,2,4,1,2,2,5,2,3,7,1,6,2;] ( F' S) m7 X t) ^ r6 v' i+ K9 M; V
data2 = [1,2,3,1,2,2,4,2,3,1,2,7,2;
2 ~0 g, g8 n: X7 E- b3 ^ 1,2,3,6,2,2,1,4,3,1,5,3,1;$ ^# T2 E6 R0 v ]
1,2,3,1,2,5,1,2,4,1,2,3,2;1 e8 {/ n1 K2 Y1 V
1,2,7,1,2,2,1,2,5,1,2,4,1;
. L( D4 s" w" Y, P6 | 5,2,3,3,5,2,1,2,3,1,2,3,6;
8 b0 ]6 _! S6 j+ e$ l 1,2,3,1,2,2,1,6,5,1,2,6,4;
- `7 R: p6 E1 }. m1 q 5,2,3,4,4,2,1,2,3,1,2,5,6;7 T9 Y8 F; U1 H9 N$ Q: }
1,2,6,1,2,2,1,2,3,1,4,3,2;
0 g5 S \# ]! P, \; ` 1,2,3,4,2,7,1,4,3,1,7,3,3;) @# H T/ e( O! b' q. K
5,2,3,5,2,2,1,2,3,1,2,3,4;
" k+ a% G( X0 l: Y1 _; T3 A 4,2,5,1,2,2,6,2,3,7,1,6,4;] % initial guess of parameters
* J8 L2 w1 E+ \( A1 D2 q4 ?% 初始化参数
* Y5 u1 Y: t/ f3 E4 g: L# Rprior1 = normalise(rand(Q,1));2 B& ~3 l8 S9 D `8 ~5 c3 D
transmat1 = mk_stochastic(rand(Q,Q));
8 s1 Z: {- G& d) N/ Jobsmat1 = mk_stochastic(rand(Q,O)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
# f g0 p! P. D7 g* Y0 x$ @% 添加部分
* b. M0 F# x0 U- @ t' y8 M prior3 = normalise(rand(Q2,1));3 E/ B# I0 A- c3 y, V2 P+ J$ y% F: g/ {
transmat3 = mk_stochastic(rand(Q2,Q2)); j7 o$ }) b' }' d) n" R3 }. E( _
obsmat3 = mk_stochastic(rand(Q2,O2));, m' |0 [, B& |4 g+ p
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % improve guess of parameters using EM
0 P* x1 b9 y1 T" s# V1 @0 I% 用data数据集训练参数矩阵形成新的HMM模型0 k) M# W, F% k# |; O" D3 g8 b
[LL, prior2, transmat2, obsmat2] = dhmm_em(data, prior1, transmat1, obsmat1, 'max_iter', size(data,1));
! W, ` g! F; o( x8 S% 训练后那行观察值与HMM匹配度1 A8 o7 i/ a# F: T+ J9 f4 X/ g
LL
+ e( Z, v" M* A& D" p6 ]% 训练后的初始概率分布
( h3 [: h$ h& [0 L& q' f4 Q* Nprior2" p% J# i* A0 b; |9 q3 c: k* Y
% 训练后的状态转移概率矩阵
# `: @) v3 ^4 k$ W. b+ Z6 ]. Ftransmat2
2 g7 r' w0 Q5 N% 观察值概率矩阵9 }8 C" o7 ^: N! ` T8 @
obsmat2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
/ ?- h% z. X( m ~; {1 v. F4 z% 添加部分% {+ g& @% C1 W9 @
[LL2, prior4, transmat4, obsmat4] = dhmm_em(data2, prior3, transmat3, obsmat3, 'max_iter', size(data2,1));- ^) j1 W0 q7 L3 J
LL2
& w! M1 k; E8 M3 F; _ prior4
8 l# o% @; Y6 o, v! | transmat4
! k% t8 G5 R( t8 S& f- D# J, l1 i obsmat47 B7 x' t! @: ]7 v8 s3 x
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % use model to compute log likelihood
- z" \: H4 r1 p5 m% data1=[1,2,3,1,2,2,1,2,3,1,2,3,1]
: R; X- K3 i1 n6 t4 Idata1 = [5,2,4,1,2,2,5,2,3,7,1,6,2]
# e3 U( r6 g+ T* S% ?$ @( `: C4 floglik = dhmm_logprob(data1, prior2, transmat2, obsmat2) @4 ?: K9 A* O7 ~# S" F7 N
% log lik is slightly different than LL(end), since it is computed after the final M step7 E) Z% r- q& V- Z
% loglik 代表着data和这个hmm(三参数为prior2, transmat2, obsmat2)的匹配值,越大说明越匹配,0为极大值。 % path为viterbi算法的结果,即最大概率path %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%* A' [6 E& |1 L9 U
% 添加部分6 H+ Z4 e" ^ A9 G% B$ C$ n
loglik2 = dhmm_logprob(data1, prior4, transmat4, obsmat4)
3 P* V7 ]+ ]+ G9 X, A( J; Z%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
/ K4 q, M% r2 c9 X( }! F1 U. gB = multinomial_prob(data1,obsmat2);6 g" J. D" G e. I% U
path = viterbi_path(prior2, transmat2, B)
# p( P" C7 Z, H4 L/ M9 msave('sa.mat');
( V: U9 ^. p9 q
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2 a4 u8 V, y$ m3 w% l% 添加部分
7 C7 m, l& q# }/ l; N B2 = multinomial_prob(data1,obsmat4);# C$ K0 c! f& }
path2 = viterbi_path(prior4, transmat4, B2)2 C c5 l6 t5 n# o4 o0 u+ R+ }
save('sa2.mat');. s5 U/ L6 G0 F) @( \* M( n! i
if loglik2 > loglik
% Z6 _1 z- e+ @7 B0 B/ N- \ fuhe = 27 q M5 X& R1 U1 g
else
! _ V/ k! m! }5 | fuhe = 1
+ \6 U2 E9 F3 y! S! O7 B end ' }, [) S; m; M) Q! t
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ------ 运行结果 ------ data = 1 2 3 1 2 2 4 2 3 1 2 7 2
0 F9 \! G! g% |6 S' m9 n2 X 1 2 3 6 2 2 1 4 3 1 5 3 1
* v4 {# Z3 [! n( Y5 U 1 2 3 1 2 5 1 2 4 1 2 3 2" |5 m3 [9 [# ?8 `" @9 Z0 O
1 2 7 1 2 2 1 2 5 1 2 4 19 ]7 O. p8 U9 [( G8 w
5 2 3 3 5 2 1 2 3 1 2 3 6
. i$ o0 J4 g+ I7 m 1 2 3 1 2 2 1 6 5 1 2 6 4* k7 x& h/ E1 D8 y
5 2 3 4 4 2 1 2 3 1 2 5 6
$ H3 o6 F: x+ i 1 2 6 1 2 2 1 2 3 1 4 3 2
! T- j; E$ h! O 1 2 3 4 2 7 1 4 3 1 7 3 3
# J, B* Y; c+ ]7 z7 }$ U5 W5 g 5 2 3 5 2 2 1 2 3 1 2 3 4
4 K" Q/ R- |/ L8 [) @" Y1 s 5 2 4 1 2 2 5 2 3 7 1 6 2 # P |* p5 e$ }! B
data2 = 1 2 3 1 2 2 4 2 3 1 2 7 2
( R9 G% i) S1 d/ I 1 2 3 6 2 2 1 4 3 1 5 3 1
6 ?3 Y0 S! X- \5 p* M9 n 1 2 3 1 2 5 1 2 4 1 2 3 2% ^) v" I5 E* n- U1 M! E' Z
1 2 7 1 2 2 1 2 5 1 2 4 1
( y) d& d4 l }9 N! Z9 r8 C6 } 5 2 3 3 5 2 1 2 3 1 2 3 6
# \7 D! m# o( g* q7 t 1 2 3 1 2 2 1 6 5 1 2 6 4) h* h: l) I A M' V$ s
5 2 3 4 4 2 1 2 3 1 2 5 6
5 D* c F ?6 w; P1 F 1 2 6 1 2 2 1 2 3 1 4 3 22 K$ B4 `0 R/ F+ O
1 2 3 4 2 7 1 4 3 1 7 3 39 W* s% ~) O# P5 O7 F; p) P
5 2 3 5 2 2 1 2 3 1 2 3 4% J/ n# H- m8 K1 C- h; w* C- r
4 2 5 1 2 2 6 2 3 7 1 6 4 iteration 1, loglik = -327.100465
2 E8 r# m% m' z0 k) oiteration 2, loglik = -238.259812
" \0 X6 ]: j" @; \0 giteration 3, loglik = -232.962948
3 Q+ G' X. |' K9 h- U Z% G+ P: V; W+ citeration 4, loglik = -223.323891# Q* P) t% h* \- G2 |# a
iteration 5, loglik = -207.630875
4 e8 s$ G/ ^9 y. x( o! z8 qiteration 6, loglik = -191.012697
8 V5 m* r7 e1 Oiteration 7, loglik = -178.611546
/ h+ k7 U4 H! v0 k0 Witeration 8, loglik = -171.524132
8 X7 @, o4 Y# F& a9 H$ K8 G" Witeration 9, loglik = -168.626526
( I' s7 t# U, W \, a/ Literation 10, loglik = -167.387057
, R6 [) @. Y8 [+ p0 e3 {/ jiteration 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 - d: r9 s0 b; q) R6 \; O
prior2 = 0.0000! l0 U: i1 u# h- r& l h2 z( I
0.0000" s5 `' P) [1 t w6 e( t. A0 I
1.0000& d1 ^) J) i, L, e/ t( Y
0.0000
( ?% W9 S1 e5 w' h# N" U3 L% u4 `/ v0 @ 0.0000 6 i6 R' l, f" [2 ~1 `
transmat2 = 0.0138 0.0089 0.7680 0.1060 0.1033
5 X% H% j0 C. `! l, I 0.7811 0.0000 0.0199 0.0067 0.19233 ?! ]7 K7 q- I4 Q8 [/ F6 W% o7 _
0.0000 0.9936 0.0000 0.0064 0.00002 g* b/ {3 R* Z3 k' j4 I X7 O
0.1686 0.2604 0.2242 0.3398 0.0070* b1 A4 L4 y9 a- T% d- a- D
0.0053 0.0406 0.8350 0.1184 0.0007
% M, H! S: ?* Sobsmat2 =
0.0000 0.2351 0.5738 0.0256 0.1118 0.0186 0.0351
0 j+ p: p j4 P$ _# b& C 0.0000 0.8270 0.0000 0.0790 0.0256 0.0456 0.0228
) ~# S8 ]* R8 s5 B ~+ u 0.7514 0.0021 0.0011 0.0550 0.1472 0.0432 0.00002 K- L- ~1 u& ~% z4 ]& y+ O
0.0014 0.4208 0.0447 0.4366 0.0023 0.0887 0.00559 i8 E4 R. R/ Q6 H7 }
0.0000 0.0784 0.3223 0.2014 0.0116 0.1525 0.2338 iteration 1, loglik = -277.7386707 k* \7 f* k8 S V
iteration 2, loglik = -242.163247
! p) O* S% Q9 S6 D- I0 riteration 3, loglik = -238.321971! P+ U) u( ?$ g, u Y
iteration 4, loglik = -233.166746
5 Y( n0 a7 w3 y3 Y9 ^; giteration 5, loglik = -225.682259& G7 p9 p) |1 y9 w7 M
iteration 6, loglik = -214.560296( E3 u7 f& Q* n# E) s
iteration 7, loglik = -201.182015( B0 J* x: x+ a7 v8 a
iteration 8, loglik = -189.427453
7 l9 o' R/ p% K1 u* j* xiteration 9, loglik = -179.156352
( d8 _4 D2 r' v1 ?: citeration 10, loglik = -171.7440967 i$ I) C' t& {1 e
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 : j' q( a F/ A' Q0 k5 U# V
prior4 = 0.0000, v! Q! [1 h, O8 n! S/ V
0.9982% F5 V* V0 i& T0 l
0.00049 {6 T9 |) S! j) b2 L
0.0014
+ R, W5 J* ?/ q: |4 T 0.0000 6 W' b/ j0 @% ?% T6 X& X; x1 e
transmat4 = 0.0873 0.5277 0.2799 0.1007 0.0045
2 ]' L1 }5 ^$ s5 j# b7 ] 0.0002 0.0000 0.0005 0.0000 0.9994
7 Z# {# r( j% A/ u x1 A& W' K 0.0180 0.0000 0.0118 0.0011 0.9692
}. m& Q$ P3 |- d3 l 0.0436 0.0226 0.0810 0.0219 0.8310* k) W6 L4 D0 w+ u% `! u
0.9746 0.0056 0.0003 0.0195 0.0000 & u" `- u! ?9 _8 C$ o0 O
obsmat4 = 0.0000 0.2012 0.5080 0.0580 0.1093 0.0465 0.0770
) g4 V9 p8 z& o6 d 0.7939 0.0001 0.0000 0.0745 0.1277 0.0038 0.0000
3 @8 P8 l9 X4 b 0.4120 0.1044 0.0049 0.1736 0.0032 0.3017 0.0001
. t4 m$ q) Z6 c9 E, u c" f7 P 0.4527 0.0622 0.0637 0.2568 0.0549 0.0295 0.0802
2 Q! w+ G6 {8 W& R! e# U 0.0000 0.8172 0.0000 0.0943 0.0270 0.0389 0.0225 - l3 Y( w7 Y) k) u
data1 = 5 2 4 1 2 2 5 2 3 7 1 6 2
0 I' K5 |3 S0 a) `/ I- Lloglik =
-19.2351 - f$ x d: G4 z2 Z" W! {- F4 m
loglik2 = -21.0715
9 @8 u2 }6 o% F, X; opath =
3 2 5 3 2 1 3 2 1 5 3 2 1
3 i8 K% b3 Y; s* d( Opath2 =
2 5 1 2 5 1 2 5 1 1 2 5 1
- m4 y& G" m3 Y. ?8 g' P) p ]! [: Hfuhe =
1 |