% ①定义一个HMM并训练这个HMM。
; Z3 N' z) q9 L3 W% ②用一组观察值测试这个HMM,计算该组观察值域HMM的匹配度。8 r) C; P$ Q% d( r( D: o. o) p: X. P
% 修改:旺齐齐
6 i) e$ [/ r, L0 B7 X% 修改部分为:添加 HMM2 模型。测试一个观察序列更加符合哪个哪个HMM模型。* J6 s# h3 @- S, z! S1 v: ]- x
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % O:观察状态数0 C# d, o' m; r7 l
O = 7;+ ^7 x" A: B- Z' ]: o
O2 = 7;7 X1 d& L- F! x
% Q:HMM状态数
. J) v- K; r" Z, e9 YQ = 5;) \. S1 s/ X5 Q1 ]9 r8 \' t
Q2 = 5;& g3 w0 I! `- u% S, a6 t v
%训练的数据集,每一行数据就是一组训练的观察值
8 ~0 L2 Q& p: E: ]6 Vdata=[1,2,3,1,2,2,4,2,3,1,2,7,2;
g# g( G y/ _0 E6 ]% Q0 t0 T! R 1,2,3,6,2,2,1,4,3,1,5,3,1;0 U6 W: R$ D4 {7 X
1,2,3,1,2,5,1,2,4,1,2,3,2;& S9 ?5 g) L6 r/ q' S3 p. ~! |0 I( k
1,2,7,1,2,2,1,2,5,1,2,4,1;
/ n; M" w$ s; z4 L 5,2,3,3,5,2,1,2,3,1,2,3,6;
& S7 c4 } R* X0 T# M 1,2,3,1,2,2,1,6,5,1,2,6,4;
2 ~9 q- r1 D: {) Q4 P 5,2,3,4,4,2,1,2,3,1,2,5,6;
7 E9 e' z* k% t! _0 e% h 1,2,6,1,2,2,1,2,3,1,4,3,2;
1 z1 ]$ _' F! n 1,2,3,4,2,7,1,4,3,1,7,3,3;
$ N( X/ `( N5 I3 i 5,2,3,5,2,2,1,2,3,1,2,3,4;% c0 c! o+ G% ?
5,2,4,1,2,2,5,2,3,7,1,6,2;]
" F& x4 {) W# D6 R: a/ y data2 = [1,2,3,1,2,2,4,2,3,1,2,7,2;
4 Z2 y# u6 e( @" r* F3 \6 M9 U) R 1,2,3,6,2,2,1,4,3,1,5,3,1;6 a8 q+ k* _( f2 @ K
1,2,3,1,2,5,1,2,4,1,2,3,2;
# h- z- n5 Z: V% T 1,2,7,1,2,2,1,2,5,1,2,4,1;' |2 I. f: n/ T8 i: {7 q8 n: V
5,2,3,3,5,2,1,2,3,1,2,3,6;% W4 N# w- S# t" K
1,2,3,1,2,2,1,6,5,1,2,6,4;9 p6 p+ j. f7 r
5,2,3,4,4,2,1,2,3,1,2,5,6;( n% j0 u( ?9 G9 D! o) _: L, U
1,2,6,1,2,2,1,2,3,1,4,3,2;( f+ A+ w3 ~& d8 Q) P/ M- ~. j8 L: `
1,2,3,4,2,7,1,4,3,1,7,3,3;
, s; h, G+ n) C/ t- f 5,2,3,5,2,2,1,2,3,1,2,3,4;; F3 S1 ]) n, {2 k' p+ m
4,2,5,1,2,2,6,2,3,7,1,6,4;]
% initial guess of parameters/ M* {$ Y8 j% [, `
% 初始化参数
5 B2 l5 G; w O8 J, j5 kprior1 = normalise(rand(Q,1));
. C- t# R. z5 utransmat1 = mk_stochastic(rand(Q,Q));6 h" F/ F+ T- D, q( W9 ?1 q6 M
obsmat1 = mk_stochastic(rand(Q,O)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0 \, `% {( k$ T6 z" ]% 添加部分
$ D2 y( U% D. ~- }) | prior3 = normalise(rand(Q2,1));- U' u M! K* W7 E
transmat3 = mk_stochastic(rand(Q2,Q2));# ]" Y2 p7 C6 l' d" A* s
obsmat3 = mk_stochastic(rand(Q2,O2)); C4 f8 n* x6 p# g0 |# R! T( S
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % improve guess of parameters using EM
1 d- F+ R- B M1 {2 s% 用data数据集训练参数矩阵形成新的HMM模型
3 b% u5 j# m0 g& M- i# L& o[LL, prior2, transmat2, obsmat2] = dhmm_em(data, prior1, transmat1, obsmat1, 'max_iter', size(data,1));
; O* P% ~( _# j2 k D% 训练后那行观察值与HMM匹配度" }+ ^; R3 ^" v% B
LL, }+ K' t+ \( H1 K9 h _: u: u
% 训练后的初始概率分布
" N0 `: p* ^9 t3 _prior2$ b) r. S7 N2 G" ^9 X
% 训练后的状态转移概率矩阵, k' v8 K8 A7 ? C( {1 a
transmat2" k: r. h" s0 [, q* K) m
% 观察值概率矩阵
4 R m: @) l3 H* r: v; xobsmat2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%* s; K3 ^, z) `: o/ ]% v& G
% 添加部分
1 v- C( G8 A8 J6 m+ o3 q) F [LL2, prior4, transmat4, obsmat4] = dhmm_em(data2, prior3, transmat3, obsmat3, 'max_iter', size(data2,1));% X+ m5 l5 `2 \. |1 ]
LL2
/ w2 l# h6 j7 P prior4
: ^, H& e2 A6 o6 [+ u transmat4
1 F% n1 `: D, I obsmat47 p/ x% r5 h1 D( O
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % use model to compute log likelihood$ `/ |" q, j) m2 P
% data1=[1,2,3,1,2,2,1,2,3,1,2,3,1]* X, j, l+ W: [/ \7 a+ x' B8 T7 j
data1 = [5,2,4,1,2,2,5,2,3,7,1,6,2]
! G8 L2 D# R' F, e, tloglik = dhmm_logprob(data1, prior2, transmat2, obsmat2)
7 v& e7 |7 e ^: v5 d% log lik is slightly different than LL(end), since it is computed after the final M step0 V1 j4 m+ Q& W- `
% loglik 代表着data和这个hmm(三参数为prior2, transmat2, obsmat2)的匹配值,越大说明越匹配,0为极大值。 % path为viterbi算法的结果,即最大概率path %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 i- _% j5 ?6 \7 b
% 添加部分
" G& _8 C ~0 Jloglik2 = dhmm_logprob(data1, prior4, transmat4, obsmat4)
) E- Y0 J: S" m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 6 C* q+ e& D7 K9 r( Q
B = multinomial_prob(data1,obsmat2);
1 `5 ]( T! |* S& Ipath = viterbi_path(prior2, transmat2, B)$ S( r4 q& u3 T
save('sa.mat'); # `6 \8 r' W# z& k- ?( q
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 X \& b9 A& I. f8 l6 Y+ v/ f
% 添加部分# T. ^" g( r- R1 W$ V+ u0 ?+ c
B2 = multinomial_prob(data1,obsmat4);: ~2 ?& h0 G% I+ ^1 N3 ^& f
path2 = viterbi_path(prior4, transmat4, B2)1 H0 W& l# ?; t+ P
save('sa2.mat'); G2 ?$ k& |* H
if loglik2 > loglik
6 i6 L" `0 ]; l9 S: L fuhe = 2
2 \% }6 w. o7 Y8 q0 A; r1 ] else
5 f+ R. U: F+ O8 d fuhe = 1 g8 `+ F$ L( l+ ~* C+ z( z
end
5 n# V* k) G- I1 X) D1 \) P9 C%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ------ 运行结果 ------ data = 1 2 3 1 2 2 4 2 3 1 2 7 2
, K& ?. M/ o! v; c 1 2 3 6 2 2 1 4 3 1 5 3 1& j8 _. s8 @% ?
1 2 3 1 2 5 1 2 4 1 2 3 2* ]1 k* x- R4 }% B! D$ g' B
1 2 7 1 2 2 1 2 5 1 2 4 15 I# ?& m; o/ O# {' T' ^$ g
5 2 3 3 5 2 1 2 3 1 2 3 6% D+ I: \- _9 I& I3 X7 X V: M! ~1 r G
1 2 3 1 2 2 1 6 5 1 2 6 4
. J) k: _& Y+ A. C% U/ x 5 2 3 4 4 2 1 2 3 1 2 5 6/ F; l& g/ T& ]3 ^: ]3 I5 p
1 2 6 1 2 2 1 2 3 1 4 3 23 A$ G0 d; O/ t2 y
1 2 3 4 2 7 1 4 3 1 7 3 33 B7 {4 |4 @# h
5 2 3 5 2 2 1 2 3 1 2 3 4+ X+ v& {8 C; t4 j9 d
5 2 4 1 2 2 5 2 3 7 1 6 2
: @, d1 [2 e( k' Rdata2 =
1 2 3 1 2 2 4 2 3 1 2 7 2+ @6 o( q% W9 w' h# a6 I/ Q
1 2 3 6 2 2 1 4 3 1 5 3 1; `' E8 y9 Q- V
1 2 3 1 2 5 1 2 4 1 2 3 22 a" ~! {' L2 X) ]4 o
1 2 7 1 2 2 1 2 5 1 2 4 18 U8 c. `; v# g c7 u5 \
5 2 3 3 5 2 1 2 3 1 2 3 6
. J- P/ e6 o. E3 @! p( K# a 1 2 3 1 2 2 1 6 5 1 2 6 4! l; O. Y# q2 O4 q$ G
5 2 3 4 4 2 1 2 3 1 2 5 6
% N( Y' }- S- | @; s8 r 1 2 6 1 2 2 1 2 3 1 4 3 2
1 c. ]! [2 {. ^9 D# ^4 C" X! ^1 m1 L 1 2 3 4 2 7 1 4 3 1 7 3 3! e9 m0 J! \+ E3 Q9 ?' s
5 2 3 5 2 2 1 2 3 1 2 3 4# ~+ v- ]2 @8 J" l w+ {# k8 h6 N
4 2 5 1 2 2 6 2 3 7 1 6 4 iteration 1, loglik = -327.1004655 I. p, G V0 W t+ c0 N
iteration 2, loglik = -238.259812
4 V4 h% k; j3 K* f R `iteration 3, loglik = -232.962948; F" Q/ H f3 t8 T
iteration 4, loglik = -223.323891% L( }0 R, ~# I7 D5 Z! p
iteration 5, loglik = -207.630875
. X4 B8 \0 F6 Z6 R2 W+ M- K. Jiteration 6, loglik = -191.012697
6 m1 c+ ^# @' h+ }* a9 xiteration 7, loglik = -178.611546
. Z# i' g0 C5 g9 iiteration 8, loglik = -171.524132
% E8 G6 y* g5 s3 @$ K" ziteration 9, loglik = -168.626526
1 r4 y5 \3 v9 G9 Literation 10, loglik = -167.387057
9 a8 `5 ~' F0 k' k) _+ z/ j% 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
' i; s! N/ g$ O" e# Nprior2 =
0.0000
+ e* b5 e2 k' G7 t7 y3 a: j5 j 0.0000
' k, M# a H0 O# e+ j6 _ 1.0000
- x2 u0 s0 L; @; A& D 0.0000
4 n5 ]$ m) _4 p/ @" q5 S 0.0000
3 u: W. D( H' e6 `transmat2 =
0.0138 0.0089 0.7680 0.1060 0.1033: C- I7 p& E$ G+ F
0.7811 0.0000 0.0199 0.0067 0.1923
( a' b/ K" t2 c0 R+ k) i 0.0000 0.9936 0.0000 0.0064 0.00000 E2 x. B0 \3 V$ q- h2 d
0.1686 0.2604 0.2242 0.3398 0.0070
* J8 |+ K9 Z0 u6 P. K+ m( w; v8 K 0.0053 0.0406 0.8350 0.1184 0.0007
, Z5 ^) q# \( S6 h/ _obsmat2 =
0.0000 0.2351 0.5738 0.0256 0.1118 0.0186 0.0351' H/ B: D+ \! y+ Z/ j4 e, d
0.0000 0.8270 0.0000 0.0790 0.0256 0.0456 0.0228 O4 y( m' v, D) A. y# s2 h
0.7514 0.0021 0.0011 0.0550 0.1472 0.0432 0.0000
; [- `. {6 D4 S6 i 0.0014 0.4208 0.0447 0.4366 0.0023 0.0887 0.0055! a) p) b; V+ D7 {6 |9 r7 `
0.0000 0.0784 0.3223 0.2014 0.0116 0.1525 0.2338 iteration 1, loglik = -277.738670) }- A# Q$ _; r2 v
iteration 2, loglik = -242.1632474 s9 l. u- M( M/ c
iteration 3, loglik = -238.321971( q( q4 k% Q" M; q# M5 W3 y
iteration 4, loglik = -233.166746
- a: u4 J0 L* _- |& ?iteration 5, loglik = -225.682259
' \8 a- H) n; e* ?) ~3 a, @iteration 6, loglik = -214.560296- z5 x5 e3 b* h9 j# Y
iteration 7, loglik = -201.182015+ i) G( `6 l( r9 r( h/ T
iteration 8, loglik = -189.427453$ X/ h( R% X5 P: c/ s: @6 c
iteration 9, loglik = -179.1563522 P2 a6 T6 y% C* x1 h- X3 @( d* x9 _( q
iteration 10, loglik = -171.744096 O. h8 D. }( ]/ v& ~
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 , o9 A `0 U _, }
prior4 = 0.0000+ J2 N5 z' K6 Y# B* V4 s, \5 \
0.9982
/ U8 h1 ]( _ \ 0.0004
! A0 B$ V3 B+ S8 h' r 0.0014
; f& I v3 y1 Z 0.0000 / {4 x9 [, ], h% F. \6 c9 C. e
transmat4 = 0.0873 0.5277 0.2799 0.1007 0.0045& M9 E+ a; W% H
0.0002 0.0000 0.0005 0.0000 0.99946 g! p3 J# `8 s! Y6 o0 P
0.0180 0.0000 0.0118 0.0011 0.96924 R3 ^& p2 p5 L! M
0.0436 0.0226 0.0810 0.0219 0.8310' P' P* b! T- C" @1 L3 Y8 H
0.9746 0.0056 0.0003 0.0195 0.0000
6 P7 k0 K% M4 j+ y0 }* O* ^obsmat4 =
0.0000 0.2012 0.5080 0.0580 0.1093 0.0465 0.0770# z; @3 {! B" Z' t
0.7939 0.0001 0.0000 0.0745 0.1277 0.0038 0.0000
9 v, p4 t- D1 q& d v 0.4120 0.1044 0.0049 0.1736 0.0032 0.3017 0.0001! W1 i' p& B, d m
0.4527 0.0622 0.0637 0.2568 0.0549 0.0295 0.0802( Y. _8 x+ N/ ^: }1 B+ n: N
0.0000 0.8172 0.0000 0.0943 0.0270 0.0389 0.0225
# n1 b: G' r, i, B- y. c6 ]data1 =
5 2 4 1 2 2 5 2 3 7 1 6 2
) R* n Y2 N, z9 Q1 uloglik =
-19.2351 % j% s4 m( s0 x) ]) A
loglik2 = -21.0715 2 M" _, \/ L" y" h
path = 3 2 5 3 2 1 3 2 1 5 3 2 1
$ Q' k' ~! Y, [. Wpath2 =
2 5 1 2 5 1 2 5 1 1 2 5 1
9 z1 r' B4 x7 f) qfuhe =
1 |