% ①定义一个HMM并训练这个HMM。$ O& Z% @$ `, Y B# Q
% ②用一组观察值测试这个HMM,计算该组观察值域HMM的匹配度。
; e# z7 N) g% w! }: m% 修改:旺齐齐2 j( z" j: g2 S3 Y* h9 A6 h3 h, T
% 修改部分为:添加 HMM2 模型。测试一个观察序列更加符合哪个哪个HMM模型。
' K+ n9 r! y0 |- T7 K%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % O:观察状态数# x$ s* i+ W, S/ u0 U; T: L* Y
O = 7;
: X2 p2 d" C3 G R CO2 = 7;
4 C! p2 P" Y2 d! t, x: k! ?+ L. h% Q:HMM状态数( ~, m9 T1 g, j& s+ M
Q = 5;0 N) S" v! Z* |- a
Q2 = 5;2 a7 m2 A% A# j2 x
%训练的数据集,每一行数据就是一组训练的观察值
, ^3 {: {5 T9 i7 R2 P; v: x) Qdata=[1,2,3,1,2,2,4,2,3,1,2,7,2;
# t# D! ]! R% Y, p! h: v 1,2,3,6,2,2,1,4,3,1,5,3,1;4 ]" |) j* G( m3 n$ F! `8 W
1,2,3,1,2,5,1,2,4,1,2,3,2;
$ }/ I) Z4 `6 q' A* K3 G 1,2,7,1,2,2,1,2,5,1,2,4,1;
. J( Q1 }; f; ?( R0 |4 ~1 s 5,2,3,3,5,2,1,2,3,1,2,3,6;% ~" C! b3 ~* _( \% B2 g
1,2,3,1,2,2,1,6,5,1,2,6,4;. W; a3 U/ P; [- h1 l
5,2,3,4,4,2,1,2,3,1,2,5,6;6 a; z) \0 ? N& S; E. o, t1 | z
1,2,6,1,2,2,1,2,3,1,4,3,2; u: B+ ]; k- K" Q0 O8 Q
1,2,3,4,2,7,1,4,3,1,7,3,3;" x4 ]5 {$ p' ^3 [/ s6 u& V% K
5,2,3,5,2,2,1,2,3,1,2,3,4;+ k4 o" L( c2 n4 ]4 y" `
5,2,4,1,2,2,5,2,3,7,1,6,2;]
3 ]+ K9 \. f8 x" ^' B9 {- J data2 = [1,2,3,1,2,2,4,2,3,1,2,7,2;# ~8 w" k& l8 v3 x- \* P
1,2,3,6,2,2,1,4,3,1,5,3,1;
% `$ V! ?4 `1 ?5 B8 U( ?6 Z 1,2,3,1,2,5,1,2,4,1,2,3,2;
# V) N$ l( x2 H 1,2,7,1,2,2,1,2,5,1,2,4,1;
( n( o. W% G' }8 V/ [ 5,2,3,3,5,2,1,2,3,1,2,3,6;
3 U8 U2 \3 f. c: r% o 1,2,3,1,2,2,1,6,5,1,2,6,4;
) W- S9 M, \; _, J- q+ H- P 5,2,3,4,4,2,1,2,3,1,2,5,6;4 ~1 s1 |. Y4 G/ ]7 b* ?
1,2,6,1,2,2,1,2,3,1,4,3,2;
" m6 v* m# o" z' D- K 1,2,3,4,2,7,1,4,3,1,7,3,3;
! s' ]( M! a) l- w: y! g 5,2,3,5,2,2,1,2,3,1,2,3,4;
; z- j2 ]1 D L" A6 q& n 4,2,5,1,2,2,6,2,3,7,1,6,4;]
% initial guess of parameters
~9 W$ e+ ]$ `2 b# D% 初始化参数
; P2 I- p$ ?( j0 i% q! aprior1 = normalise(rand(Q,1));; Z& I' M* M" w; Q7 P% t, v
transmat1 = mk_stochastic(rand(Q,Q));2 L3 T0 a- V/ Q: @: k/ S' V
obsmat1 = mk_stochastic(rand(Q,O)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
: t# |$ T0 Y* N% y4 \7 ?% 添加部分 b! |# ?" u0 [, O! v9 q+ f; Q; L
prior3 = normalise(rand(Q2,1));2 t+ F- m* O: o7 f( u+ z
transmat3 = mk_stochastic(rand(Q2,Q2));/ o, d# f; J& [7 ^
obsmat3 = mk_stochastic(rand(Q2,O2));2 u5 z- T8 D1 x( t9 f+ I. M7 h8 ?0 r
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % improve guess of parameters using EM$ J+ n& C: r. n% G, {2 i( h
% 用data数据集训练参数矩阵形成新的HMM模型. O/ E$ t7 V/ e7 t# a) u
[LL, prior2, transmat2, obsmat2] = dhmm_em(data, prior1, transmat1, obsmat1, 'max_iter', size(data,1)); C3 U" f9 ^6 o2 O1 z
% 训练后那行观察值与HMM匹配度
9 q0 i8 `! R" Y: M4 z! m& HLL/ Y0 X6 W# {4 v+ d$ Z5 I- n* f
% 训练后的初始概率分布
. f& l9 s: L7 {- Q4 b9 mprior2
9 p+ X" Z9 W+ E0 `% c, S$ V! m* ]! r9 t% 训练后的状态转移概率矩阵9 z. M8 Y$ G! a, k
transmat2
, z1 ?' V* f3 J6 B6 O. t8 t. e% 观察值概率矩阵
9 k- H. ^3 ~ | U8 R& Y; {obsmat2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
" B; i! U0 B! g. s+ Q x- `3 n, b0 b% 添加部分
1 F h# `: G; O( B$ T [LL2, prior4, transmat4, obsmat4] = dhmm_em(data2, prior3, transmat3, obsmat3, 'max_iter', size(data2,1));3 ?+ `6 a$ ~ p; v$ X
LL2
1 S1 D( \5 M. N# f8 p4 k7 X3 t prior4
9 F2 k" l% E r- s) C( O) A transmat4
2 A1 L$ z6 Y1 v+ I* D obsmat4( r$ H$ C9 Q8 ^* H: L6 e
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % use model to compute log likelihood
, N v3 Z5 c' V2 H% data1=[1,2,3,1,2,2,1,2,3,1,2,3,1]
' Y3 B! I4 ~0 s7 Ndata1 = [5,2,4,1,2,2,5,2,3,7,1,6,2]
+ ^* h9 P$ }1 ?/ O6 Sloglik = dhmm_logprob(data1, prior2, transmat2, obsmat2)) S% W. p) b) S, x
% log lik is slightly different than LL(end), since it is computed after the final M step6 o- T+ ?9 A1 E0 h. F( V$ u. E" m/ Z
% loglik 代表着data和这个hmm(三参数为prior2, transmat2, obsmat2)的匹配值,越大说明越匹配,0为极大值。 % path为viterbi算法的结果,即最大概率path %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%' [3 H) n8 S* Z4 `- W
% 添加部分
. [+ u) C- R/ v8 {: Tloglik2 = dhmm_logprob(data1, prior4, transmat4, obsmat4)
& _$ S7 x; r. w' S9 j%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
. r2 P/ N `+ Z& U/ Y/ LB = multinomial_prob(data1,obsmat2);0 w8 L5 P4 b, ^& w
path = viterbi_path(prior2, transmat2, B)8 O6 L4 ^" k! [9 I Y
save('sa.mat');
6 P! V( W) K2 {0 @3 T
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 E7 W% D) O9 M6 K4 ^ s `( q7 p7 T
% 添加部分
; l M7 K5 d. x: x B2 = multinomial_prob(data1,obsmat4);1 U) W3 u( b7 }6 n- x3 x
path2 = viterbi_path(prior4, transmat4, B2)
5 `8 ~, c, O. I save('sa2.mat');
% g q$ c& B8 m3 t4 [ if loglik2 > loglik ! @5 ?- L! M+ b- `6 e4 Z4 ?
fuhe = 2) E: Z# @" S) L% K9 p: |/ f) P
else
& X N. `4 Z% o6 [ fuhe = 1
8 w K0 k* ]9 I* M5 C end
& r( g: Y) V- }# i8 x# f$ v3 i$ M%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ------ 运行结果 ------ data = 1 2 3 1 2 2 4 2 3 1 2 7 2
; ?" O5 j$ N8 L5 y% d1 S' _4 e 1 2 3 6 2 2 1 4 3 1 5 3 1
0 u! x& K# \# r3 O/ _# K5 _+ M `' L- d 1 2 3 1 2 5 1 2 4 1 2 3 2$ s& `- E0 H" y( J9 J; l; @: \5 C4 U' Y
1 2 7 1 2 2 1 2 5 1 2 4 1* L5 n/ \& l f7 a! X6 Y X) ^
5 2 3 3 5 2 1 2 3 1 2 3 6
- ? u: |. h6 L k 1 2 3 1 2 2 1 6 5 1 2 6 4
7 @) z) A; G3 i- h! c 5 2 3 4 4 2 1 2 3 1 2 5 6# b# a% }4 C/ t0 g+ }
1 2 6 1 2 2 1 2 3 1 4 3 20 E( R% ~& M5 x2 h+ n) M7 m
1 2 3 4 2 7 1 4 3 1 7 3 3
9 x# ], E% ]' [6 k 5 2 3 5 2 2 1 2 3 1 2 3 4
* Y$ O G3 w9 Y1 N4 C( j% M 5 2 4 1 2 2 5 2 3 7 1 6 2
9 G! b: M/ M. s) Xdata2 =
1 2 3 1 2 2 4 2 3 1 2 7 2& W1 @2 K9 u! ?6 o: S& i0 ~2 H
1 2 3 6 2 2 1 4 3 1 5 3 1
1 g# v% I6 S3 ]- y& L4 a) g" i$ f 1 2 3 1 2 5 1 2 4 1 2 3 2$ P3 P$ }# L! p: e' r. M' X
1 2 7 1 2 2 1 2 5 1 2 4 1$ [5 _( w L9 d6 A
5 2 3 3 5 2 1 2 3 1 2 3 6; v5 T1 l- t4 |5 q9 b8 |" I
1 2 3 1 2 2 1 6 5 1 2 6 4
- O: G" M1 U, |0 d* ~& n, T/ } 5 2 3 4 4 2 1 2 3 1 2 5 6: _6 y+ ?: O( l( h* V
1 2 6 1 2 2 1 2 3 1 4 3 25 U" o1 `+ e% m8 ~* n0 p( `7 a" K
1 2 3 4 2 7 1 4 3 1 7 3 3
0 m5 a- G6 t7 Y: | 5 2 3 5 2 2 1 2 3 1 2 3 4
( q4 U: {2 x: L: R) J8 }, w$ k* r7 | 4 2 5 1 2 2 6 2 3 7 1 6 4 iteration 1, loglik = -327.1004657 V; T( A! F6 j, Y5 r4 w
iteration 2, loglik = -238.259812
5 @& x. W- D C- Piteration 3, loglik = -232.962948: s5 y% v. d5 x9 l) `) r, Z6 i E
iteration 4, loglik = -223.323891/ d- y2 f Y% l! u, O$ U! p2 u
iteration 5, loglik = -207.6308759 ^0 k4 r! l1 N
iteration 6, loglik = -191.0126973 k8 u4 j% Z: {9 A0 _& W+ B& H
iteration 7, loglik = -178.611546
$ l! Y8 i8 l$ J, A& uiteration 8, loglik = -171.524132
* p3 l) V8 K/ N- ^" ?iteration 9, loglik = -168.626526( c8 }" j, t0 D2 p4 Z
iteration 10, loglik = -167.387057
1 ]1 O+ `1 l5 h: \iteration 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
3 `) ^; `5 ~ Qprior2 =
0.0000
# w; Z# k% e& o* \6 r& W 0.00003 S. K2 F% F, P6 M h t
1.0000
6 l1 ^( y# o+ u 0.0000+ O. Z+ N" p1 V4 n: ]0 p3 B% D4 }
0.0000 : V& |$ q7 _: x2 G! ]' N! g
transmat2 = 0.0138 0.0089 0.7680 0.1060 0.1033
T% m) h! y) v: X) Y 0.7811 0.0000 0.0199 0.0067 0.19236 i& C1 r* w) U, N
0.0000 0.9936 0.0000 0.0064 0.00008 g* |" e2 ` B: q* f' ]
0.1686 0.2604 0.2242 0.3398 0.0070( y" ]; O9 y, r0 X/ {
0.0053 0.0406 0.8350 0.1184 0.0007 9 ?; \$ }& G" e9 a5 X/ U% G) {
obsmat2 = 0.0000 0.2351 0.5738 0.0256 0.1118 0.0186 0.0351# r! J0 `0 Y9 f! Q! z
0.0000 0.8270 0.0000 0.0790 0.0256 0.0456 0.02282 I# ?* D! c1 C9 {
0.7514 0.0021 0.0011 0.0550 0.1472 0.0432 0.0000* S0 P6 \9 ]; R1 v: {) n; p& G$ y
0.0014 0.4208 0.0447 0.4366 0.0023 0.0887 0.0055
2 o, s: D& j8 |0 [/ y l; L/ z 0.0000 0.0784 0.3223 0.2014 0.0116 0.1525 0.2338 iteration 1, loglik = -277.738670
0 z5 C+ B# m2 @6 J" g* Miteration 2, loglik = -242.163247
/ z! K. l2 K! X5 ?3 i9 J/ fiteration 3, loglik = -238.321971: v2 o5 D( h6 q( D
iteration 4, loglik = -233.166746& {& {) v4 a7 e2 i
iteration 5, loglik = -225.682259; t8 O- c" y% V( B& _
iteration 6, loglik = -214.560296
, V6 w3 {, Q7 s1 siteration 7, loglik = -201.182015. k$ R! H K" l* e3 f
iteration 8, loglik = -189.4274535 \8 c$ ^0 \2 P* p! T2 q& i
iteration 9, loglik = -179.1563529 q! G1 e- Q+ u6 [" d
iteration 10, loglik = -171.744096
7 [& c9 M2 ?- }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
+ O* I3 H4 @8 Fprior4 =
0.0000. l7 a2 x7 [1 l9 g, ~: `
0.9982
6 U" n1 v3 o: a- g 0.0004
4 \5 u$ c$ ?% z( N6 u+ {) s3 r 0.0014! p9 p/ y: Y1 t
0.0000
5 O9 U% {: U# {4 w3 h$ f& ptransmat4 =
0.0873 0.5277 0.2799 0.1007 0.0045( t& T0 Q; H3 \2 G. G/ X
0.0002 0.0000 0.0005 0.0000 0.9994
- h% F/ j K! ]& _; ^- _ 0.0180 0.0000 0.0118 0.0011 0.9692
. m1 ^) z; B( `5 X7 ?, W2 D: M, ^2 _ 0.0436 0.0226 0.0810 0.0219 0.8310
) D5 Z* Q3 U; P6 J$ h 0.9746 0.0056 0.0003 0.0195 0.0000
6 ^8 v# z1 T( ]2 F/ ?obsmat4 =
0.0000 0.2012 0.5080 0.0580 0.1093 0.0465 0.07706 c r8 V2 B# ?- F% H
0.7939 0.0001 0.0000 0.0745 0.1277 0.0038 0.0000: B6 \: [0 d" E$ G+ ?
0.4120 0.1044 0.0049 0.1736 0.0032 0.3017 0.0001
8 J* j% u$ [$ w+ F0 P 0.4527 0.0622 0.0637 0.2568 0.0549 0.0295 0.0802
0 D1 V' L: I* D4 C/ q' A0 y1 p 0.0000 0.8172 0.0000 0.0943 0.0270 0.0389 0.0225
' u' `- y; k K' edata1 =
5 2 4 1 2 2 5 2 3 7 1 6 2
; L+ e6 o: d6 F) Ploglik =
-19.2351
. u5 m: n) Q2 Q3 N4 V; ologlik2 =
-21.0715 9 K0 d0 w- ^0 _& h3 L% G
path = 3 2 5 3 2 1 3 2 1 5 3 2 1 - D: C% K# {8 Z; s( u& `0 D: W
path2 = 2 5 1 2 5 1 2 5 1 1 2 5 1
, E/ m/ B1 R) }3 {" a- |5 gfuhe =
1 |