% ①定义一个HMM并训练这个HMM。4 z) p7 z: F0 G8 j: Z
% ②用一组观察值测试这个HMM,计算该组观察值域HMM的匹配度。
- r( |& e9 D+ Q% 修改:旺齐齐
/ m9 l- u( w! W' C/ ]1 S% 修改部分为:添加 HMM2 模型。测试一个观察序列更加符合哪个哪个HMM模型。3 v8 d& g) p! K( m+ N4 Z# W
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % O:观察状态数+ S8 y" i& W! H# H
O = 7;: w$ i8 I" h/ c9 | l8 Z
O2 = 7;; a' c8 _! H4 p: O% C# K/ C. @6 c# T
% Q:HMM状态数
+ s! @9 P- _& tQ = 5;5 x$ Y, A1 Z$ U H
Q2 = 5;
( d# k3 v( R0 M( K6 l) Q%训练的数据集,每一行数据就是一组训练的观察值5 o! l- F! D, B2 i4 V
data=[1,2,3,1,2,2,4,2,3,1,2,7,2;5 i' W, d, n" y$ {+ {
1,2,3,6,2,2,1,4,3,1,5,3,1;+ _% { d0 \* M/ k0 B
1,2,3,1,2,5,1,2,4,1,2,3,2;* T6 A x& g- D2 q* i# V" S
1,2,7,1,2,2,1,2,5,1,2,4,1;' X. h# \) v: F0 V9 O
5,2,3,3,5,2,1,2,3,1,2,3,6;
9 v7 m( @1 K& F' {. U 1,2,3,1,2,2,1,6,5,1,2,6,4;
" y1 S- F+ j7 m" | 5,2,3,4,4,2,1,2,3,1,2,5,6;
( ^8 u- I5 [# _# C) G- h 1,2,6,1,2,2,1,2,3,1,4,3,2;* x- D% F; M+ Z0 W" [, P
1,2,3,4,2,7,1,4,3,1,7,3,3;
9 t7 O$ P& T8 V. ~: a 5,2,3,5,2,2,1,2,3,1,2,3,4;
6 X% \+ j( P. e' O6 l) C' ^$ B 5,2,4,1,2,2,5,2,3,7,1,6,2;] 4 a+ e. a8 n4 ^
data2 = [1,2,3,1,2,2,4,2,3,1,2,7,2;5 r1 U ?. R( z) ^8 y- B% ~' J
1,2,3,6,2,2,1,4,3,1,5,3,1;/ s4 e$ h- ~ l- [ e( E2 u# l2 c
1,2,3,1,2,5,1,2,4,1,2,3,2;6 \6 t$ H5 V5 Y" T
1,2,7,1,2,2,1,2,5,1,2,4,1;2 i: I* ~0 z/ s; g# P- i4 I
5,2,3,3,5,2,1,2,3,1,2,3,6;
4 ]* ?/ Y8 X. ?5 [5 _ s8 t' L 1,2,3,1,2,2,1,6,5,1,2,6,4;
5 V& j5 A4 |" Z. ?' u4 p$ F 5,2,3,4,4,2,1,2,3,1,2,5,6;
' j9 V1 [% c# s/ ]5 z 1,2,6,1,2,2,1,2,3,1,4,3,2;
2 t, y, p9 a$ H2 C 1,2,3,4,2,7,1,4,3,1,7,3,3;
3 C2 d' _, [+ h" h( A 5,2,3,5,2,2,1,2,3,1,2,3,4;2 u: N, E* D' V4 v2 ?, c
4,2,5,1,2,2,6,2,3,7,1,6,4;] % initial guess of parameters, w& e1 F. l4 y$ l8 e
% 初始化参数0 D% h( Y) x' d$ M
prior1 = normalise(rand(Q,1));
3 z. X1 N- F, Z& Y; d+ [1 R1 F4 Stransmat1 = mk_stochastic(rand(Q,Q));
9 ^0 t1 y% g O" p" _, Kobsmat1 = mk_stochastic(rand(Q,O)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
# h' s- f0 O8 \% 添加部分
8 y1 D4 r ~: i# y5 g; b& T; t' R prior3 = normalise(rand(Q2,1));- i/ C: Y) A4 o( y
transmat3 = mk_stochastic(rand(Q2,Q2));! T# H. o8 T6 g. T6 T
obsmat3 = mk_stochastic(rand(Q2,O2));
# r" V: w& p# V0 B' x- [0 l( ~%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % improve guess of parameters using EM
" `( v! U+ T0 k8 \6 K* ]4 K% 用data数据集训练参数矩阵形成新的HMM模型
4 \8 D* z& G/ M9 p[LL, prior2, transmat2, obsmat2] = dhmm_em(data, prior1, transmat1, obsmat1, 'max_iter', size(data,1));) t3 [9 B7 | a: j. B
% 训练后那行观察值与HMM匹配度
' h" C" x/ s+ B, bLL
" I+ U$ k- k, Y5 d% 训练后的初始概率分布& i# g3 `- T2 z5 q8 c
prior2
+ _- C, X; f- |$ S8 |) F( d% U5 P% 训练后的状态转移概率矩阵' _3 ~1 C2 e; [8 K/ `; U7 p
transmat2
8 K9 W0 z4 I" i# ^7 c7 _0 [% 观察值概率矩阵$ F% j( q, g4 ?' m) u y
obsmat2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
K0 [% \- ]* b' T# d9 j: l) g% 添加部分
1 R) ^ q* l) [- V% T+ w* w* u' ] [LL2, prior4, transmat4, obsmat4] = dhmm_em(data2, prior3, transmat3, obsmat3, 'max_iter', size(data2,1));
8 e; R: T" g4 {! D4 P LL2) q! Y5 _7 E3 }9 b
prior48 M2 A6 |1 x/ E+ Y
transmat4
8 D E, ?% s$ x1 p, s) ~' c: U5 y k obsmat4
2 j$ Q& C2 [! X& g' Q' ~, h3 k( x; V%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % use model to compute log likelihood
# C1 }; Q4 E2 {( S4 K. I3 E% data1=[1,2,3,1,2,2,1,2,3,1,2,3,1]
- F: J; P0 w4 I1 r- wdata1 = [5,2,4,1,2,2,5,2,3,7,1,6,2]7 Z6 Z; g- b+ y9 m9 d
loglik = dhmm_logprob(data1, prior2, transmat2, obsmat2)2 Z" B3 z4 f% F! d7 g; b9 E) F
% log lik is slightly different than LL(end), since it is computed after the final M step
$ Q1 L/ Q! V: f+ d! D6 \ }% loglik 代表着data和这个hmm(三参数为prior2, transmat2, obsmat2)的匹配值,越大说明越匹配,0为极大值。 % path为viterbi算法的结果,即最大概率path %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 ]$ X9 n; C# S, s" |* H0 V
% 添加部分+ z: ^3 v+ C2 q
loglik2 = dhmm_logprob(data1, prior4, transmat4, obsmat4)8 [" A" q! }: D i! O
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! }7 `4 S3 o+ a# ~$ [; t, ~- oB = multinomial_prob(data1,obsmat2);: H5 t5 y4 U9 w
path = viterbi_path(prior2, transmat2, B)1 C* ], n C- L o! u$ i
save('sa.mat');
" L9 H0 A7 ?7 h Y4 x
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 q w" }3 U# P% P+ E
% 添加部分
. @4 f- F$ P9 W# N B2 = multinomial_prob(data1,obsmat4);7 a4 N$ I( r+ O3 K( {3 r" m
path2 = viterbi_path(prior4, transmat4, B2)
; V- v( A, N5 }+ q8 ~ save('sa2.mat');$ ^) ]) a% ~+ g# m- l* N& Y2 I
if loglik2 > loglik / [8 Q: ~( q0 a/ c0 h: W
fuhe = 2
6 t' q/ I4 Y' Z! _# \$ ^ else
, ^0 D) R4 C6 T; @( X$ p fuhe = 1
9 G/ C) ~+ {1 @- N9 I" n i end
% G. ?1 L0 s T* S%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ------ 运行结果 ------ data = 1 2 3 1 2 2 4 2 3 1 2 7 2
, k# r9 q2 _3 u 1 2 3 6 2 2 1 4 3 1 5 3 1# w, Z |9 k& y* p5 J5 A
1 2 3 1 2 5 1 2 4 1 2 3 25 T# ]$ `% B7 U" s$ W( r
1 2 7 1 2 2 1 2 5 1 2 4 1" c# d1 E* T) \4 C$ _/ T" n
5 2 3 3 5 2 1 2 3 1 2 3 6
5 P2 Z1 q6 x( k' }( e 1 2 3 1 2 2 1 6 5 1 2 6 4
$ y0 p- M/ @1 _4 R. z, G- m 5 2 3 4 4 2 1 2 3 1 2 5 6
* v& M/ B) w G 1 2 6 1 2 2 1 2 3 1 4 3 2
" I9 u9 z9 S0 s6 K! A" [ 1 2 3 4 2 7 1 4 3 1 7 3 3
/ |0 M4 \ N S) W( F* D0 h- D8 u 5 2 3 5 2 2 1 2 3 1 2 3 4
6 L- m4 ?) ~! P6 I6 F0 q 5 2 4 1 2 2 5 2 3 7 1 6 2 5 H+ Z; `4 S2 U; `) S% A5 v
data2 = 1 2 3 1 2 2 4 2 3 1 2 7 2
/ l: a" T7 U6 }( c2 l 1 2 3 6 2 2 1 4 3 1 5 3 1
, ~8 D, Z n Y. P) r 1 2 3 1 2 5 1 2 4 1 2 3 2
: v5 U1 @' k" ^* l/ l- }: H3 c3 p7 z 1 2 7 1 2 2 1 2 5 1 2 4 1
* w5 o# q: n8 E0 l* o4 _ 5 2 3 3 5 2 1 2 3 1 2 3 6
% B p" n( t2 ?8 F 1 2 3 1 2 2 1 6 5 1 2 6 4! |" [4 f, b+ J4 k
5 2 3 4 4 2 1 2 3 1 2 5 6
' [$ ^5 G& M* N+ H 1 2 6 1 2 2 1 2 3 1 4 3 2
$ u6 S5 ]1 V6 m% t& I$ ^1 U" y( f 1 2 3 4 2 7 1 4 3 1 7 3 31 X( b p8 A$ P( ~3 c& R, z4 B
5 2 3 5 2 2 1 2 3 1 2 3 4# P) N9 |/ ~; I6 r4 J' @
4 2 5 1 2 2 6 2 3 7 1 6 4 iteration 1, loglik = -327.100465
9 ]& ]; e+ C/ W7 Z1 Citeration 2, loglik = -238.2598120 V1 w: @# J/ s# `
iteration 3, loglik = -232.9629485 S# n; K, C8 `6 K4 C
iteration 4, loglik = -223.323891
- F+ l+ M3 g# h- `iteration 5, loglik = -207.630875
- d" s* Q! o; Hiteration 6, loglik = -191.0126976 a% p" F' x* C# g; B8 Z
iteration 7, loglik = -178.6115467 w. }7 b; A3 o6 m0 Q
iteration 8, loglik = -171.5241323 g% Z$ A, Z& j) c/ `+ C; V. J- ?' p
iteration 9, loglik = -168.626526
4 D" q, q+ \5 }+ D- Piteration 10, loglik = -167.387057
4 g2 z* i( V; l7 @2 J0 Eiteration 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 ( `+ o+ n- Y$ l9 O. s
prior2 = 0.0000. { _5 j% E' B4 Y" Z
0.0000
) ^& ~2 Z& D# w& i 1.0000, S( J. k" d' j* ^. D" f, Q1 E/ A
0.0000& i/ ~' E! I8 @- H+ C& ~
0.0000
) M1 Q4 g' @! d, d$ N2 d/ o6 \transmat2 =
0.0138 0.0089 0.7680 0.1060 0.1033
. p# K: p1 d0 x( S 0.7811 0.0000 0.0199 0.0067 0.1923
1 a) D( M; `& @* I' M$ T z9 |; C7 X 0.0000 0.9936 0.0000 0.0064 0.0000: N! W( z2 ^9 B4 H: o9 \6 a# |
0.1686 0.2604 0.2242 0.3398 0.0070" ^) i% d1 n$ Z2 L& u$ v
0.0053 0.0406 0.8350 0.1184 0.0007 - L% p! G- n1 j( ^
obsmat2 = 0.0000 0.2351 0.5738 0.0256 0.1118 0.0186 0.0351
% S7 {! N! ^5 F. N 0.0000 0.8270 0.0000 0.0790 0.0256 0.0456 0.0228! [$ L; k; Y8 } `, b% i! N
0.7514 0.0021 0.0011 0.0550 0.1472 0.0432 0.0000
5 H; f; N9 q& Y. f( P( f5 r/ H 0.0014 0.4208 0.0447 0.4366 0.0023 0.0887 0.0055
" h$ \7 y6 R0 j' D 0.0000 0.0784 0.3223 0.2014 0.0116 0.1525 0.2338 iteration 1, loglik = -277.738670
' ]2 ~3 B2 e/ P. c5 O( literation 2, loglik = -242.163247
. h2 ^& A) o- L9 i$ Q' riteration 3, loglik = -238.3219712 l2 Q2 q% ^! n* @
iteration 4, loglik = -233.166746* `; D- a! t: K e
iteration 5, loglik = -225.682259
% u) _/ V7 T7 P# qiteration 6, loglik = -214.560296
- L. J' t+ D: @iteration 7, loglik = -201.1820152 p4 i7 p- y. s* N. v+ B
iteration 8, loglik = -189.427453$ R \2 q/ ], }
iteration 9, loglik = -179.156352
) i8 j$ u7 O2 ~7 R% ~9 fiteration 10, loglik = -171.7440968 H) _$ [- O& }. H/ l
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 ' D$ G! k" e) @5 q4 W: c
prior4 = 0.0000$ m6 x B* X, x! [
0.9982( m# A/ j: W( t& u/ ^0 ?
0.0004
- P7 ~$ B; d4 b# p9 f" X0 L j 0.0014) x, ~8 o$ F* o% Z+ ^6 @
0.0000
3 d" F7 u- Y* otransmat4 =
0.0873 0.5277 0.2799 0.1007 0.0045* P9 ^- o! S. t- c S4 W0 N2 E0 G
0.0002 0.0000 0.0005 0.0000 0.9994/ I* Z/ Z1 R3 n$ q% u
0.0180 0.0000 0.0118 0.0011 0.96928 O5 ]/ T Y9 K' v( K( }3 i
0.0436 0.0226 0.0810 0.0219 0.8310
& c1 t$ e8 n) f0 n9 m 0.9746 0.0056 0.0003 0.0195 0.0000
$ f v6 O, f, m% h& U) Vobsmat4 =
0.0000 0.2012 0.5080 0.0580 0.1093 0.0465 0.0770
# P: t1 I: o9 U: ~; v4 t& A5 v 0.7939 0.0001 0.0000 0.0745 0.1277 0.0038 0.0000
' @; O/ U. t; A' f 0.4120 0.1044 0.0049 0.1736 0.0032 0.3017 0.0001$ V) \. N8 I" [. V& X% E
0.4527 0.0622 0.0637 0.2568 0.0549 0.0295 0.08020 E$ c4 r# q2 b, c. h! j7 G4 D4 A9 q
0.0000 0.8172 0.0000 0.0943 0.0270 0.0389 0.0225 |+ v& `$ @+ [! z$ h2 h+ {
data1 = 5 2 4 1 2 2 5 2 3 7 1 6 2 , ?) w8 l$ t' A# ^2 [
loglik = -19.2351 2 j- I T) a% _6 z5 b6 A6 T) L
loglik2 = -21.0715
~7 T" e# w$ G/ y4 P3 I! Ipath =
3 2 5 3 2 1 3 2 1 5 3 2 1
2 o' ]& E. e( Z; Gpath2 =
2 5 1 2 5 1 2 5 1 1 2 5 1 6 D* Z3 Z0 _$ K$ q3 v6 ^' `
fuhe = 1 |