% ①定义一个HMM并训练这个HMM。
# m8 { s; j; [; s0 K% ②用一组观察值测试这个HMM,计算该组观察值域HMM的匹配度。5 x+ [, C. b$ J0 F2 i- i$ V, U& |
% 修改:旺齐齐
# A: Q) }: Y5 ^+ ]( n. J$ ^% 修改部分为:添加 HMM2 模型。测试一个观察序列更加符合哪个哪个HMM模型。
3 @8 s$ u+ m* `9 \+ R9 A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % O:观察状态数
" \* a) W. h) c" M7 yO = 7;
: q5 |% B* ?/ N7 p, pO2 = 7;1 e5 l$ x* n3 H4 ^, ?% s6 }( |
% Q:HMM状态数$ Z/ I( G, b6 w( i) r
Q = 5;1 {, I. l% ~8 X4 a, Y
Q2 = 5;+ f& ^% K7 b4 d0 ]% P1 v$ ]1 \
%训练的数据集,每一行数据就是一组训练的观察值
$ I0 a( c$ y* N, n. s4 _) q9 hdata=[1,2,3,1,2,2,4,2,3,1,2,7,2;
, o* b F9 v# C5 Y2 f 1,2,3,6,2,2,1,4,3,1,5,3,1;
; n2 _' f. q( R# j 1,2,3,1,2,5,1,2,4,1,2,3,2;
. S: W$ u+ P% t2 c* r 1,2,7,1,2,2,1,2,5,1,2,4,1;. r: G, P& J" c2 B2 m! R
5,2,3,3,5,2,1,2,3,1,2,3,6;8 l; a+ u' H2 E7 J1 g4 W0 L
1,2,3,1,2,2,1,6,5,1,2,6,4;
) C) V/ D9 `% b& n3 g; ` g 5,2,3,4,4,2,1,2,3,1,2,5,6;
3 C$ A1 `1 E& X* r 1,2,6,1,2,2,1,2,3,1,4,3,2;, k) I" x# m- h# T+ S2 e
1,2,3,4,2,7,1,4,3,1,7,3,3;
5 t* h0 x/ A. n* ?$ A 5,2,3,5,2,2,1,2,3,1,2,3,4;, o0 x+ w( a" v: B0 R! r
5,2,4,1,2,2,5,2,3,7,1,6,2;]
# p" g, T+ ^! P data2 = [1,2,3,1,2,2,4,2,3,1,2,7,2;1 V' ?# Z+ _: J- H* [: G
1,2,3,6,2,2,1,4,3,1,5,3,1;8 o7 f4 W4 D; [/ B, i: H
1,2,3,1,2,5,1,2,4,1,2,3,2;9 ~. C8 s2 \, H, B8 S% q7 o
1,2,7,1,2,2,1,2,5,1,2,4,1;, e; a* @9 f) I6 o9 @$ M6 ]
5,2,3,3,5,2,1,2,3,1,2,3,6;
, ?$ D% g) j8 n 1,2,3,1,2,2,1,6,5,1,2,6,4;
) ~: S1 j A1 Z" V* \/ s1 Z7 c 5,2,3,4,4,2,1,2,3,1,2,5,6;
8 j$ g5 D) X+ E' g( m U. p* @& j) G8 {5 ` 1,2,6,1,2,2,1,2,3,1,4,3,2;+ R+ ]: X7 ~7 [
1,2,3,4,2,7,1,4,3,1,7,3,3;
5 }7 g0 U$ K' N& y# F6 G 5,2,3,5,2,2,1,2,3,1,2,3,4;6 U# R% j, Q* t/ T8 a* S3 x
4,2,5,1,2,2,6,2,3,7,1,6,4;]
% initial guess of parameters
, b9 k8 D( G+ ^% 初始化参数
' Y7 I3 [1 e5 {% ]. e/ sprior1 = normalise(rand(Q,1));" c7 H$ j, [6 W8 _8 S
transmat1 = mk_stochastic(rand(Q,Q));4 ~- I: p! j b$ p
obsmat1 = mk_stochastic(rand(Q,O)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%' ?. v7 l. c& U$ n* Q& p; c
% 添加部分7 Y3 d$ Q7 p% @7 A6 T
prior3 = normalise(rand(Q2,1));
! a; ?" W7 A/ p. x) r; ]' u, k& b transmat3 = mk_stochastic(rand(Q2,Q2));1 _9 d( U# J/ P" V& e- Q; h
obsmat3 = mk_stochastic(rand(Q2,O2));
% f9 A3 Z6 H6 j- |; \: h4 X%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % improve guess of parameters using EM
" E8 {( i |3 |- b0 O2 f) m: J% 用data数据集训练参数矩阵形成新的HMM模型" f: g9 m6 V6 t! l6 \
[LL, prior2, transmat2, obsmat2] = dhmm_em(data, prior1, transmat1, obsmat1, 'max_iter', size(data,1));
! t' j( l$ p+ E g3 A5 c% 训练后那行观察值与HMM匹配度
" R% w+ l& R/ A# S+ P6 y" x3 ULL- D, P( `* l' S7 f/ G
% 训练后的初始概率分布4 g5 O" F8 R& L9 x
prior2; W6 T2 ~' a a4 v/ m! {1 U+ r
% 训练后的状态转移概率矩阵& _) ^( A/ \' B
transmat2
6 P+ j4 T! y+ L) q% 观察值概率矩阵
3 u/ C' Q" `* U; Y8 ]) K: Q: hobsmat2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4 J" b" s7 [. \$ g; k% 添加部分: n% ^3 ?# J+ b6 C
[LL2, prior4, transmat4, obsmat4] = dhmm_em(data2, prior3, transmat3, obsmat3, 'max_iter', size(data2,1));0 V6 r, d# V O
LL2
, H; t6 B7 s0 O+ R% q prior4
" e! z' M, _" S6 T transmat4. G* M% P* t v* F& R, M% g& h3 f
obsmat4' S8 j; B" r- B6 b/ i) p
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % use model to compute log likelihood5 p% X2 W1 b0 W4 ]4 Q5 Z
% data1=[1,2,3,1,2,2,1,2,3,1,2,3,1], I6 N$ k& f6 ~2 k1 R! Q
data1 = [5,2,4,1,2,2,5,2,3,7,1,6,2]0 ^$ ]+ x$ N' p0 o8 e6 `
loglik = dhmm_logprob(data1, prior2, transmat2, obsmat2)
% `, ?& q' p, z, C$ z% \% log lik is slightly different than LL(end), since it is computed after the final M step
' x' l/ Z. A9 ]- _% loglik 代表着data和这个hmm(三参数为prior2, transmat2, obsmat2)的匹配值,越大说明越匹配,0为极大值。 % path为viterbi算法的结果,即最大概率path %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%! j/ V( x7 S0 ], L. j, @+ h
% 添加部分/ q- i5 `: e& L6 ]) ?
loglik2 = dhmm_logprob(data1, prior4, transmat4, obsmat4)
" E8 v2 u8 j& y& u%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 7 H: O' |0 A3 k1 H3 R8 W
B = multinomial_prob(data1,obsmat2);
0 h( o% v, y, _3 e$ npath = viterbi_path(prior2, transmat2, B)+ u) C! f' G# K" r8 D
save('sa.mat'); 7 w$ T( \) {$ ~8 h& `+ c- M
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%" a+ e; j5 c( l& Y6 R1 J! w
% 添加部分
( O' V* ^$ H4 V& ?& K B2 = multinomial_prob(data1,obsmat4);
0 Z% f% W9 y# l8 C- W$ g. Z path2 = viterbi_path(prior4, transmat4, B2)! D9 L; i+ V" ^2 J/ M
save('sa2.mat');, \0 i0 C4 J, u+ I( t+ u s
if loglik2 > loglik 3 p/ Y W, Y3 @% n0 `# l( e
fuhe = 2* I: S" a8 k7 X. S/ [7 ?
else% b' \2 x x8 G! s
fuhe = 1% |9 B6 F, ?2 |: w1 z
end 4 k& G' c+ P: E% e# A
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ------ 运行结果 ------ data = 1 2 3 1 2 2 4 2 3 1 2 7 2- T0 J5 j/ J9 d! ^
1 2 3 6 2 2 1 4 3 1 5 3 1- L4 M2 @9 F9 q3 {6 T( N
1 2 3 1 2 5 1 2 4 1 2 3 2
k. j% f( t) {+ `( {5 F 1 2 7 1 2 2 1 2 5 1 2 4 15 Y0 S9 A! z# U2 N. D2 ~
5 2 3 3 5 2 1 2 3 1 2 3 68 R7 z2 q; e7 d5 n i4 @
1 2 3 1 2 2 1 6 5 1 2 6 47 H7 E/ r9 |) [* I& ^& l8 H
5 2 3 4 4 2 1 2 3 1 2 5 66 W5 _$ r+ S. G# ^; t
1 2 6 1 2 2 1 2 3 1 4 3 2
5 f7 P2 X' C9 \1 L R0 `8 h+ [ 1 2 3 4 2 7 1 4 3 1 7 3 3
! S3 d9 u$ r7 X) n 5 2 3 5 2 2 1 2 3 1 2 3 4
g& W- S$ L! r. ^: B9 y" V+ a 5 2 4 1 2 2 5 2 3 7 1 6 2
; V' p* r- Z; K" X0 X6 @$ rdata2 =
1 2 3 1 2 2 4 2 3 1 2 7 2: v: w$ r! ^) X D9 R" p
1 2 3 6 2 2 1 4 3 1 5 3 18 a* j: [2 b, U8 ~; ]0 D% q
1 2 3 1 2 5 1 2 4 1 2 3 2
- _. N6 a; ^, e$ v& s/ o 1 2 7 1 2 2 1 2 5 1 2 4 1
% d( {' p5 y+ R& c' m! q$ o 5 2 3 3 5 2 1 2 3 1 2 3 63 ^' I) q! G2 z" ?# n' O, W0 B5 B
1 2 3 1 2 2 1 6 5 1 2 6 4
1 w' Q* ~2 n" C7 |6 N8 g 5 2 3 4 4 2 1 2 3 1 2 5 6
, d) L7 O* K, X! z% ?; {* a 1 2 6 1 2 2 1 2 3 1 4 3 2
" H: ]: a7 Z. F+ @7 D6 I 1 2 3 4 2 7 1 4 3 1 7 3 3' P9 D$ @1 C9 M
5 2 3 5 2 2 1 2 3 1 2 3 4
8 ?* E6 y8 |) D/ r+ I 4 2 5 1 2 2 6 2 3 7 1 6 4 iteration 1, loglik = -327.100465/ N" ^" y* \% ~- A8 V; u2 {8 y: s
iteration 2, loglik = -238.2598129 n. t8 y$ \0 T y4 z
iteration 3, loglik = -232.962948& ~/ z. r6 C R7 z$ E; Q+ f
iteration 4, loglik = -223.323891
; x. g& [" l2 h witeration 5, loglik = -207.630875
" i- U! T, B/ W6 f) uiteration 6, loglik = -191.012697
8 v1 A4 t: f K& X4 z2 Siteration 7, loglik = -178.611546; C! d3 `; e8 g6 f( ?
iteration 8, loglik = -171.524132
, w7 y5 ]$ R: ~8 a. n# v/ Kiteration 9, loglik = -168.626526
' g6 a( {2 N* X; @4 ^5 D# u u) niteration 10, loglik = -167.387057
) S# [+ [+ s1 m" I, citeration 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 ; A$ y# o' a. c! I! O% v% h. X
prior2 = 0.0000
0 Q! r: Z( b7 Q$ } 0.0000+ P0 E7 Q: i- z! }' r
1.0000. R( [6 X$ c9 J4 w& N
0.0000. P5 A5 ]) q5 C9 g
0.0000 5 u7 |- K5 d2 F: M# F) j0 ?% _
transmat2 = 0.0138 0.0089 0.7680 0.1060 0.10334 T- K! W1 t, G& L; C9 A
0.7811 0.0000 0.0199 0.0067 0.1923- {' g. r5 S& J2 m5 G1 ?
0.0000 0.9936 0.0000 0.0064 0.00003 f! M' q, j$ d: E) H
0.1686 0.2604 0.2242 0.3398 0.0070
G6 \! c; U) W4 _4 x8 A( U1 L 0.0053 0.0406 0.8350 0.1184 0.0007
1 E, O* T% M. O. Mobsmat2 =
0.0000 0.2351 0.5738 0.0256 0.1118 0.0186 0.0351
0 X( D0 l7 ]( A) _) d* U 0.0000 0.8270 0.0000 0.0790 0.0256 0.0456 0.0228
2 E) k6 S, V! o: M+ E, A 0.7514 0.0021 0.0011 0.0550 0.1472 0.0432 0.0000. n! G" W( i& }$ p# D
0.0014 0.4208 0.0447 0.4366 0.0023 0.0887 0.0055
6 ~$ f$ s4 ^; u( q' W/ r* _, t% y o 0.0000 0.0784 0.3223 0.2014 0.0116 0.1525 0.2338 iteration 1, loglik = -277.738670
' A: Z( G9 A" @# I; Aiteration 2, loglik = -242.163247 y9 i: g4 E T. A" ?
iteration 3, loglik = -238.321971
9 K2 G) X2 N1 {" giteration 4, loglik = -233.166746" F1 b: u; T+ [7 n( D
iteration 5, loglik = -225.682259
) q& q4 g0 _' p% j7 H$ biteration 6, loglik = -214.560296
9 e4 u. q+ G1 F/ H: Xiteration 7, loglik = -201.1820158 n5 Z$ K1 M" o& t! m/ I/ H
iteration 8, loglik = -189.427453
& _4 V; K4 x& K' ?- P" d- aiteration 9, loglik = -179.156352
, j& i0 g8 L$ A& G( K5 Qiteration 10, loglik = -171.7440969 b8 n& Q& u+ @1 v& t. y
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 8 I* U0 y x$ D" n$ H) U
prior4 = 0.0000% y3 b) d. I% o* Q
0.9982% q0 j1 B& h/ @+ \" g
0.00042 h( v, a) p% J
0.0014
, i8 ^! ^3 I' }3 q' u 0.0000 5 t0 `" d( \: g9 m+ p3 y3 ^9 O' j
transmat4 = 0.0873 0.5277 0.2799 0.1007 0.0045) g6 E1 g* Z Q
0.0002 0.0000 0.0005 0.0000 0.9994
1 g4 K2 S: `% M4 `% W* f1 | 0.0180 0.0000 0.0118 0.0011 0.9692
# E- ?3 C* n2 f8 c; }. t 0.0436 0.0226 0.0810 0.0219 0.8310; F) c& U3 i- t% B# e! s+ m
0.9746 0.0056 0.0003 0.0195 0.0000
+ k M9 W8 h# |obsmat4 =
0.0000 0.2012 0.5080 0.0580 0.1093 0.0465 0.0770% H2 q* [1 g, p& c
0.7939 0.0001 0.0000 0.0745 0.1277 0.0038 0.0000
( w: P9 G4 h# h* v4 z 0.4120 0.1044 0.0049 0.1736 0.0032 0.3017 0.0001# G o9 ~- o4 p+ p4 s, A
0.4527 0.0622 0.0637 0.2568 0.0549 0.0295 0.0802, H, T; k0 Q3 U# F0 J8 [
0.0000 0.8172 0.0000 0.0943 0.0270 0.0389 0.0225
8 _8 {) V$ |) ~2 B6 ddata1 =
5 2 4 1 2 2 5 2 3 7 1 6 2
$ ~$ f: a6 V6 C) Zloglik =
-19.2351
2 U1 h+ D- n; t6 Nloglik2 =
-21.0715 ; y+ E" }! c8 I. l! E$ {
path = 3 2 5 3 2 1 3 2 1 5 3 2 1
) o6 N7 ~/ G( Kpath2 =
2 5 1 2 5 1 2 5 1 1 2 5 1
1 v$ t; }0 z& j, nfuhe =
1 |