% ①定义一个HMM并训练这个HMM。* |7 s# r+ F. I. I v, J+ M
% ②用一组观察值测试这个HMM,计算该组观察值域HMM的匹配度。. _" z1 O2 t; Q& R% a
% 修改:旺齐齐; u4 p1 P. h$ V4 b! q) w: h
% 修改部分为:添加 HMM2 模型。测试一个观察序列更加符合哪个哪个HMM模型。8 ]4 K: R E) O d1 z" c2 P% o
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % O:观察状态数
4 v+ o" F0 R* c* v2 a! zO = 7;
* e8 K+ u0 d( K* V/ {/ uO2 = 7;" K7 t2 P$ {( U! P9 r
% Q:HMM状态数
% W; ?9 B, L2 {4 [" b% pQ = 5;
3 E, x$ @7 t: i) F! m+ T$ k3 rQ2 = 5;6 c) Z# ]6 a e. O. |
%训练的数据集,每一行数据就是一组训练的观察值
5 z% l0 |/ r0 v) [3 s. Ydata=[1,2,3,1,2,2,4,2,3,1,2,7,2;/ `4 y( g+ G& y( f
1,2,3,6,2,2,1,4,3,1,5,3,1;
$ v) I6 Z8 Y' V" y 1,2,3,1,2,5,1,2,4,1,2,3,2;9 r! H4 I2 _8 n) ]; k3 n5 o
1,2,7,1,2,2,1,2,5,1,2,4,1;4 I% f1 T3 y# l2 R0 l
5,2,3,3,5,2,1,2,3,1,2,3,6;/ q& X! m& X* s* H9 d$ b: ]& r* r7 B
1,2,3,1,2,2,1,6,5,1,2,6,4;
/ J9 i9 m* @: A: b9 ]1 L* \: { 5,2,3,4,4,2,1,2,3,1,2,5,6;8 b7 P4 F4 a% a/ x/ p" i' H2 U/ e
1,2,6,1,2,2,1,2,3,1,4,3,2;( p* @ Z) z" ~7 r, h/ v0 i
1,2,3,4,2,7,1,4,3,1,7,3,3;
- {+ i/ @- @9 V9 R) L7 a5 R 5,2,3,5,2,2,1,2,3,1,2,3,4;
8 {- F7 l! r6 R7 S 5,2,4,1,2,2,5,2,3,7,1,6,2;]
( V0 ]( M$ q0 O& c6 _: z4 ~ data2 = [1,2,3,1,2,2,4,2,3,1,2,7,2;1 \% p2 o* D* s
1,2,3,6,2,2,1,4,3,1,5,3,1;
& j z. K/ z# v' f6 s$ R: k# c0 ` 1,2,3,1,2,5,1,2,4,1,2,3,2;, Q# s3 ~0 M/ @$ w2 W* Z9 K. V# I, t
1,2,7,1,2,2,1,2,5,1,2,4,1;3 ^( e+ q* V, {: z! `
5,2,3,3,5,2,1,2,3,1,2,3,6;9 R* O2 O* ^8 S7 ~. ~- s7 s% y
1,2,3,1,2,2,1,6,5,1,2,6,4;
, Q& a2 W7 \4 Y. D2 d 5,2,3,4,4,2,1,2,3,1,2,5,6;
3 _: p4 C6 y' \0 d7 C/ e6 s/ h 1,2,6,1,2,2,1,2,3,1,4,3,2;
" |/ Z; [& _& ?7 v' ? 1,2,3,4,2,7,1,4,3,1,7,3,3;
/ h* K# ? z6 j+ i/ ~* d" A: n8 `5 A 5,2,3,5,2,2,1,2,3,1,2,3,4;" r# K4 h N9 Q
4,2,5,1,2,2,6,2,3,7,1,6,4;]
% initial guess of parameters. r, X1 t# A5 R+ [# I* {
% 初始化参数
9 l8 |2 ?. a% }$ H+ hprior1 = normalise(rand(Q,1));6 U- X" v! R" _* t1 Y4 Q
transmat1 = mk_stochastic(rand(Q,Q));: W, q. |4 o% ?6 L/ Z! |% e' {
obsmat1 = mk_stochastic(rand(Q,O)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
* u, a4 v0 D. M! C5 d% 添加部分
* t ?& D; t j; o" S! x7 s1 j# ~ prior3 = normalise(rand(Q2,1));* w9 H& Z r6 n2 U2 I8 v
transmat3 = mk_stochastic(rand(Q2,Q2));
4 y2 f* z& y, [8 Z obsmat3 = mk_stochastic(rand(Q2,O2));
& _/ l3 ^3 \+ \# I7 }9 ~, M%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % improve guess of parameters using EM: J) |& H1 X8 p& A. v. M8 i
% 用data数据集训练参数矩阵形成新的HMM模型7 \* q7 p) U! |$ U! H
[LL, prior2, transmat2, obsmat2] = dhmm_em(data, prior1, transmat1, obsmat1, 'max_iter', size(data,1));! T% Y! J" h/ y
% 训练后那行观察值与HMM匹配度
6 z+ L: C4 w) ]+ F7 XLL
8 e0 X3 [5 f8 W% 训练后的初始概率分布+ ?/ ~! D# A" |% \1 @/ H0 V
prior2
7 x" S% w/ C" {8 X7 K; @. s% 训练后的状态转移概率矩阵' n( \% e$ F# G" |) e2 m' S ~: k
transmat2
' w0 V9 N5 C# v: x# m% 观察值概率矩阵" `+ z- k* S8 r$ r7 g2 E7 | I
obsmat2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 o, ]* Q t* M! @
% 添加部分# Q$ Z" b2 o# `/ q
[LL2, prior4, transmat4, obsmat4] = dhmm_em(data2, prior3, transmat3, obsmat3, 'max_iter', size(data2,1));* `# x: I$ s" ~# r q! V: Z3 b: N
LL2
% b5 i, n3 C; L R. a) Q7 I9 T D prior4
0 l; l% B7 _' V% a6 E+ _" y, P4 ~9 m. S transmat4
0 v @% {9 k7 g3 i' [ obsmat4
5 F. @% {) p& I' c8 @8 x/ o2 g%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % use model to compute log likelihood% n# s" `& q3 w/ v2 W+ c5 [* e2 R
% data1=[1,2,3,1,2,2,1,2,3,1,2,3,1]: o1 o/ E9 u. ^1 |- X l
data1 = [5,2,4,1,2,2,5,2,3,7,1,6,2]
; ]/ ]5 r1 V! @. D; |1 A0 E2 A: q8 Kloglik = dhmm_logprob(data1, prior2, transmat2, obsmat2)
2 C N& D5 |9 s1 z& X# b% log lik is slightly different than LL(end), since it is computed after the final M step
" X% d' p# f1 L" }7 T- w7 k% loglik 代表着data和这个hmm(三参数为prior2, transmat2, obsmat2)的匹配值,越大说明越匹配,0为极大值。 % path为viterbi算法的结果,即最大概率path %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
" t: K* ~5 y( b% 添加部分
4 _: A9 O3 G+ m+ ^/ F8 p$ xloglik2 = dhmm_logprob(data1, prior4, transmat4, obsmat4)% d7 [6 Z" B! b% C$ Y! g. D
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
' ^* p" m! q) H1 Z+ x0 s8 l5 PB = multinomial_prob(data1,obsmat2);0 }/ C& A1 B( N3 h0 i) O9 A
path = viterbi_path(prior2, transmat2, B)
8 g7 L# E0 ]# M& E3 I1 D0 [2 K6 Fsave('sa.mat');
9 Y4 o/ x, O( ^7 ^+ j9 K8 |%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 K5 _/ E2 j7 H9 q, a. v
% 添加部分! p! a9 b0 r; u; N7 x
B2 = multinomial_prob(data1,obsmat4);; s& D( @9 Q2 Z0 b
path2 = viterbi_path(prior4, transmat4, B2)5 z5 Z3 G7 `8 N( v( `) d
save('sa2.mat');
# J f# G2 p# Y; Z if loglik2 > loglik
' m4 J. C- s9 A" j2 u0 P fuhe = 2( H" T) E- H' |- V4 t' w0 F5 [
else
9 V9 R) i) N# d E fuhe = 1
5 V, R- i1 H3 ]: h+ e end
' P2 ^4 V& g( q' x- `%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
------ 运行结果 ------ data = 1 2 3 1 2 2 4 2 3 1 2 7 23 g7 i+ ^+ \- f. K6 d+ n, q
1 2 3 6 2 2 1 4 3 1 5 3 1, ^: b# {3 `: `8 T2 _
1 2 3 1 2 5 1 2 4 1 2 3 2 K9 a* J) S; v, M0 d( v1 |! H
1 2 7 1 2 2 1 2 5 1 2 4 1
6 P1 q( m. H! j 5 2 3 3 5 2 1 2 3 1 2 3 6
; s* B$ O1 @6 x& Z. t8 y% z9 @; A 1 2 3 1 2 2 1 6 5 1 2 6 42 G& E f; `! n$ y1 w9 V
5 2 3 4 4 2 1 2 3 1 2 5 6
3 P: m( Q0 j$ v2 Z7 n9 ^ 1 2 6 1 2 2 1 2 3 1 4 3 2
`2 n# x% f; U" `$ X8 [, R! Z 1 2 3 4 2 7 1 4 3 1 7 3 37 T9 j" l6 e5 e3 M$ q! Y
5 2 3 5 2 2 1 2 3 1 2 3 4
9 t c; T" f# F2 N. y/ K 5 2 4 1 2 2 5 2 3 7 1 6 2 1 W, s1 }4 S7 S
data2 = 1 2 3 1 2 2 4 2 3 1 2 7 2
: y) L2 N0 a) }7 [& A6 l/ y- @ 1 2 3 6 2 2 1 4 3 1 5 3 1
" ?4 e& S3 k8 q5 i 1 2 3 1 2 5 1 2 4 1 2 3 2
8 ~' S+ ?1 Q2 `, e- I( ]1 D 1 2 7 1 2 2 1 2 5 1 2 4 1. F8 P# @5 S8 q! r1 `
5 2 3 3 5 2 1 2 3 1 2 3 60 g; k, d7 h( @, i
1 2 3 1 2 2 1 6 5 1 2 6 4
3 _- O, W- _+ }1 |; [ 5 2 3 4 4 2 1 2 3 1 2 5 6
- k9 h/ r( `3 k- M5 T! m$ l. C9 o( n 1 2 6 1 2 2 1 2 3 1 4 3 2
, K3 \1 o( B0 Q9 }' M8 E 1 2 3 4 2 7 1 4 3 1 7 3 3
+ @0 z. Y' y8 M4 I" G, j0 d7 s 5 2 3 5 2 2 1 2 3 1 2 3 4
0 N: f. w4 [. r ? 4 2 5 1 2 2 6 2 3 7 1 6 4 iteration 1, loglik = -327.100465
) m; U. c x! N: Y) |7 witeration 2, loglik = -238.2598125 E U: l+ ~1 b# n* x
iteration 3, loglik = -232.962948/ p1 n; r% `2 O! S6 Z; s
iteration 4, loglik = -223.3238910 e+ w5 l; t* |8 T
iteration 5, loglik = -207.630875, Y/ C$ u7 H; T
iteration 6, loglik = -191.012697
]% r/ D8 d% [% u' Q c; q9 p' ?- Ziteration 7, loglik = -178.611546" s! e C" h/ ]! `9 {/ ?
iteration 8, loglik = -171.524132! s4 V/ e2 r- i. @, h8 Y
iteration 9, loglik = -168.626526
) G; A | S: q% aiteration 10, loglik = -167.387057
" Q5 M1 |8 S6 V/ f/ ~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 ' v0 W$ J+ i, l. K4 k/ G
prior2 = 0.0000
u Z# \1 T; k$ i 0.00007 q. O3 q$ a' @, d2 [
1.0000+ ^7 h6 |# s. h8 T. ^( m" p
0.0000
: h; [& n8 t3 p- H/ s 0.0000 - x4 U& f& l4 s6 p. } o2 N
transmat2 = 0.0138 0.0089 0.7680 0.1060 0.1033 }+ S1 o4 {" i2 k# D" h
0.7811 0.0000 0.0199 0.0067 0.1923' f1 U g4 c) h' |
0.0000 0.9936 0.0000 0.0064 0.0000% d* e: Y5 ?( K8 B
0.1686 0.2604 0.2242 0.3398 0.00702 f' `' R2 u3 D8 c
0.0053 0.0406 0.8350 0.1184 0.0007
1 b/ Q- H0 e0 I8 k" xobsmat2 =
0.0000 0.2351 0.5738 0.0256 0.1118 0.0186 0.0351
" S9 d* j, y% N0 i 0.0000 0.8270 0.0000 0.0790 0.0256 0.0456 0.02281 M1 S# A. J) u! D/ k% M2 v# Y
0.7514 0.0021 0.0011 0.0550 0.1472 0.0432 0.0000% V( f# V; [9 _& y, l' r
0.0014 0.4208 0.0447 0.4366 0.0023 0.0887 0.00553 }4 j' T, L" G' o, d0 x% [. u9 [
0.0000 0.0784 0.3223 0.2014 0.0116 0.1525 0.2338 iteration 1, loglik = -277.738670
: q: B; \4 ?7 p ]$ ~1 `iteration 2, loglik = -242.163247
4 n6 i0 T" s. s4 Diteration 3, loglik = -238.321971
1 l+ X" V% S A/ niteration 4, loglik = -233.166746
: `9 ~; t; H$ W1 j! s9 x) @& ^8 R% ?iteration 5, loglik = -225.682259 r4 B/ C" U( U% ~2 u
iteration 6, loglik = -214.5602963 T& W0 @ O) x
iteration 7, loglik = -201.182015
6 s' u$ o7 n( N5 V- Niteration 8, loglik = -189.427453
: P; ~: ^: B$ J$ u/ f) ~iteration 9, loglik = -179.156352
8 a- Y8 d4 G5 eiteration 10, loglik = -171.744096
5 O1 V7 ^8 p6 V$ _4 T. N* Riteration 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 K/ U% O5 P) D3 w4 d3 j
prior4 = 0.0000
# ]5 u% L/ G( \7 o# I 0.9982
+ ~+ u6 F- y& }; i 0.0004
/ S& G* w' D0 g* ?% F" }7 m# w. R 0.0014
7 Y: ?6 W T) l; | 0.0000 # I( [& @/ r: D3 t
transmat4 = 0.0873 0.5277 0.2799 0.1007 0.0045' p) Y4 C' \6 R4 c
0.0002 0.0000 0.0005 0.0000 0.99949 K; `/ N9 [1 m" z- c$ l
0.0180 0.0000 0.0118 0.0011 0.96928 H! F2 _0 ^ H; r( o
0.0436 0.0226 0.0810 0.0219 0.8310
1 c% b5 ?) `! \9 y 0.9746 0.0056 0.0003 0.0195 0.0000
$ K( \1 W* @8 Tobsmat4 =
0.0000 0.2012 0.5080 0.0580 0.1093 0.0465 0.0770
! G' x" i R) D 0.7939 0.0001 0.0000 0.0745 0.1277 0.0038 0.00009 W" {: |; H3 X* Q4 b( e r
0.4120 0.1044 0.0049 0.1736 0.0032 0.3017 0.0001
. E. @8 U5 c ~/ L 0.4527 0.0622 0.0637 0.2568 0.0549 0.0295 0.08027 w7 C3 }; G; @& S2 y
0.0000 0.8172 0.0000 0.0943 0.0270 0.0389 0.0225
- m7 k, _% @4 s: \data1 =
5 2 4 1 2 2 5 2 3 7 1 6 2
1 t/ U& |. v5 }) ^loglik =
-19.2351 # {5 J3 ~8 N2 ~4 Z( V" @6 V( z
loglik2 = -21.0715
# B; W4 [5 c! x) Epath =
3 2 5 3 2 1 3 2 1 5 3 2 1 % T: i1 [) j7 k. \8 i3 h
path2 = 2 5 1 2 5 1 2 5 1 1 2 5 1
/ l) ?! a5 x: b2 v- O3 lfuhe =
1 |