% ①定义一个HMM并训练这个HMM。
. p; ]* \3 m! w5 G% A% ②用一组观察值测试这个HMM,计算该组观察值域HMM的匹配度。* w7 h4 Y% [5 u+ @$ f
% 修改:旺齐齐
7 p' G) r4 k' w0 F0 z9 P% 修改部分为:添加 HMM2 模型。测试一个观察序列更加符合哪个哪个HMM模型。
$ L' x/ r* }6 |7 H' M% m& o%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % O:观察状态数! R* T/ L* G8 `1 z9 F0 {2 i3 ^) n9 l
O = 7;) u* Q; W. j; s0 I( t, c A
O2 = 7;
0 Y( F. z* H+ S0 p5 O7 ~% B% Q:HMM状态数
h3 n$ i/ a1 h. M; D6 {! ?Q = 5;
$ Q. `& S, i2 W C* ]+ B2 m5 zQ2 = 5;& b5 D; `6 I) U5 G' l$ H: v8 O
%训练的数据集,每一行数据就是一组训练的观察值1 D0 m1 s4 Z1 s
data=[1,2,3,1,2,2,4,2,3,1,2,7,2;
8 \0 o" y. N8 _' q" N' w- [ 1,2,3,6,2,2,1,4,3,1,5,3,1;/ F2 |8 J7 B. r7 {# a, Q A% L
1,2,3,1,2,5,1,2,4,1,2,3,2;- w# L3 i/ i) c6 G* X8 U, z( _( p5 s0 {
1,2,7,1,2,2,1,2,5,1,2,4,1;6 v! ^9 n( d z# M! Y& {$ F
5,2,3,3,5,2,1,2,3,1,2,3,6;
! D5 m" s( u3 \ D O% g1 b+ L 1,2,3,1,2,2,1,6,5,1,2,6,4;9 G* d1 q4 Y( y
5,2,3,4,4,2,1,2,3,1,2,5,6;
) o7 u6 i' o8 a' z4 O) E 1,2,6,1,2,2,1,2,3,1,4,3,2;
* }6 }' s3 j+ M 1,2,3,4,2,7,1,4,3,1,7,3,3;) x7 s; A j) @( z
5,2,3,5,2,2,1,2,3,1,2,3,4;8 [/ g1 w! V3 V# M1 G% x
5,2,4,1,2,2,5,2,3,7,1,6,2;] ' A) ?7 O3 _% t
data2 = [1,2,3,1,2,2,4,2,3,1,2,7,2;$ O% w- j7 S# e+ x" ~
1,2,3,6,2,2,1,4,3,1,5,3,1;
# z3 |; O+ x3 y; _1 `- U* _* M 1,2,3,1,2,5,1,2,4,1,2,3,2;: O- f# }1 v7 u
1,2,7,1,2,2,1,2,5,1,2,4,1;' o' u$ B s/ N6 ^7 T
5,2,3,3,5,2,1,2,3,1,2,3,6;
$ z8 Q& t8 H- r* G: Q/ ~0 A 1,2,3,1,2,2,1,6,5,1,2,6,4;
7 ?. P1 W A; { 5,2,3,4,4,2,1,2,3,1,2,5,6;
/ f6 W/ j6 s* ?0 l2 y' p! ^ 1,2,6,1,2,2,1,2,3,1,4,3,2;. \, t2 M: U" s2 \2 U5 q @
1,2,3,4,2,7,1,4,3,1,7,3,3;$ n* k# O9 p/ z- o8 I
5,2,3,5,2,2,1,2,3,1,2,3,4;
3 f9 V( z/ J, X' b& h 4,2,5,1,2,2,6,2,3,7,1,6,4;] % initial guess of parameters# E" @" r" e% f j7 ?( Q) s* g
% 初始化参数0 z' y! s" c1 b1 n
prior1 = normalise(rand(Q,1));
' k$ J4 n7 W* n+ htransmat1 = mk_stochastic(rand(Q,Q));
; T* {/ c. I, t7 gobsmat1 = mk_stochastic(rand(Q,O)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%# R9 P8 ?' p. i( y4 t
% 添加部分
8 I% b! _% Z( E) }8 L4 ^- L prior3 = normalise(rand(Q2,1));
& L" k- r4 ^& J( I7 u* n) k transmat3 = mk_stochastic(rand(Q2,Q2));8 V$ }& A _7 N4 ]' ?
obsmat3 = mk_stochastic(rand(Q2,O2));
0 ~3 w, r( ~' X; w3 K- p. }# b%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % improve guess of parameters using EM
- t+ ?9 x; Y6 ~% _2 a8 W% s5 E: x& F% 用data数据集训练参数矩阵形成新的HMM模型0 S. J4 ]/ n1 E. l# |
[LL, prior2, transmat2, obsmat2] = dhmm_em(data, prior1, transmat1, obsmat1, 'max_iter', size(data,1));$ A) N* y+ N8 O' U, |8 s+ x1 Z
% 训练后那行观察值与HMM匹配度
5 P+ ^0 T1 n& _LL
8 U& A& J1 U8 U0 }9 @. C1 N6 e# o% 训练后的初始概率分布* G+ @; k, W9 m; p! p2 {. i
prior29 g. c" m) L3 k. P
% 训练后的状态转移概率矩阵0 |( t; p, C4 m" Z& Z# A
transmat26 k9 ^& n2 M; _
% 观察值概率矩阵
1 I' }0 n5 Y. x/ pobsmat2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%, Y' C- i3 x8 l' G/ S8 F
% 添加部分
; W( I2 Q$ x% l$ r [LL2, prior4, transmat4, obsmat4] = dhmm_em(data2, prior3, transmat3, obsmat3, 'max_iter', size(data2,1));
3 p4 n# O4 `+ j2 t3 X LL2
A8 U1 [% R) B8 F/ N2 q9 f prior4
& m" u) c9 K# n! t3 U* `+ R transmat4
) p/ N5 a& f# d6 q( [% V& r obsmat48 r. O* z+ ] N- ? H/ c% V6 J4 b
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % use model to compute log likelihood2 R. q( k4 d( q! a! Z4 W4 H
% data1=[1,2,3,1,2,2,1,2,3,1,2,3,1]2 _6 j' m, @/ a' D
data1 = [5,2,4,1,2,2,5,2,3,7,1,6,2]) R$ X! Q: f- V2 ~" U
loglik = dhmm_logprob(data1, prior2, transmat2, obsmat2)8 I& D' L+ K! e B# Y( x
% log lik is slightly different than LL(end), since it is computed after the final M step
# @1 }1 U0 L! \- m% loglik 代表着data和这个hmm(三参数为prior2, transmat2, obsmat2)的匹配值,越大说明越匹配,0为极大值。 % path为viterbi算法的结果,即最大概率path %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%, j% O/ w2 N# q d9 H
% 添加部分
6 Z5 A: t/ q; M$ |- G6 U% V- Wloglik2 = dhmm_logprob(data1, prior4, transmat4, obsmat4)) V, P4 z) o# z" R
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! r5 D" |# Q, E' YB = multinomial_prob(data1,obsmat2);
5 ]( m! x$ m7 z; opath = viterbi_path(prior2, transmat2, B)
* I. e. L- ^% l, C. nsave('sa.mat');
( h0 D6 z% @( y4 x, _0 N: P7 _3 C%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 w ?) `- b' q7 t
% 添加部分2 C3 k2 z) d1 b! z0 n
B2 = multinomial_prob(data1,obsmat4);/ V& }# l& J0 v* Q/ ^6 _( ~
path2 = viterbi_path(prior4, transmat4, B2)
- c- Z9 c" T) h9 i2 M$ T) e4 M% m3 ` save('sa2.mat');; b4 L; a5 m' y! j* y. Y; D5 D
if loglik2 > loglik ' W% B" f( h, c4 _1 j4 }; b9 {7 o
fuhe = 28 s! i# {9 A* i3 h( e8 R% b% z
else- |4 |* D& {: E1 S1 i" U
fuhe = 1) g7 h u/ s3 K; n
end
- ], ~3 T$ e$ v& A, L%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
------ 运行结果 ------ data = 1 2 3 1 2 2 4 2 3 1 2 7 2, N, X2 J8 r8 u* ^
1 2 3 6 2 2 1 4 3 1 5 3 1
% ~8 y$ q0 z# I) O# e 1 2 3 1 2 5 1 2 4 1 2 3 2% V) t4 Y* Z O
1 2 7 1 2 2 1 2 5 1 2 4 1$ X# L7 f3 [# h! T7 t/ J. I- Y3 ?
5 2 3 3 5 2 1 2 3 1 2 3 6
/ p0 B* q3 Q5 m' g+ }* ^, G 1 2 3 1 2 2 1 6 5 1 2 6 4( ^( U0 S a$ G. k4 Z# B' i
5 2 3 4 4 2 1 2 3 1 2 5 6
' o/ c& |4 y' T& g 1 2 6 1 2 2 1 2 3 1 4 3 2
8 S, T @2 r9 m, [! r2 _ 1 2 3 4 2 7 1 4 3 1 7 3 3
9 a9 e/ a4 I# P5 G8 K( I3 I& W 5 2 3 5 2 2 1 2 3 1 2 3 4
8 \; ~4 g( U8 W; \5 S 5 2 4 1 2 2 5 2 3 7 1 6 2 & M. Q) n, b8 `& K& y- [2 M
data2 = 1 2 3 1 2 2 4 2 3 1 2 7 2
' b" F" b0 _- z6 C1 L4 W 1 2 3 6 2 2 1 4 3 1 5 3 1* y* q( { q/ y- y" j. @
1 2 3 1 2 5 1 2 4 1 2 3 25 d0 n& L( I& F8 d% d
1 2 7 1 2 2 1 2 5 1 2 4 1
- C' a6 q# w6 E. V 5 2 3 3 5 2 1 2 3 1 2 3 6
! z4 y( [" ], x+ i 1 2 3 1 2 2 1 6 5 1 2 6 4
+ W$ n( r# t+ ]0 l8 ]( @! o1 x 5 2 3 4 4 2 1 2 3 1 2 5 67 A# j3 Z0 F" r |4 X9 s
1 2 6 1 2 2 1 2 3 1 4 3 2( }* A1 l! ^- [% O' ]
1 2 3 4 2 7 1 4 3 1 7 3 3; ]% U- [0 u" t& x5 x" a( ]
5 2 3 5 2 2 1 2 3 1 2 3 4! y |; O X3 E7 _. |8 z+ D, [
4 2 5 1 2 2 6 2 3 7 1 6 4 iteration 1, loglik = -327.100465/ K f. W2 L+ M) a0 o) Y* h" ~5 Y
iteration 2, loglik = -238.259812
% C9 |2 ]- a7 }4 Riteration 3, loglik = -232.962948( m0 k; E: H) t1 \7 J/ G
iteration 4, loglik = -223.3238910 {+ J' {% s: S8 N- |
iteration 5, loglik = -207.630875" }: f, v7 n5 C. H& ^ Z5 d
iteration 6, loglik = -191.012697
" \# w) q! D# L9 p' u/ Witeration 7, loglik = -178.611546
4 [/ \* P0 `, Y3 e7 |! h( c1 {3 literation 8, loglik = -171.524132
6 |1 }# R- o$ ]8 K! U4 Biteration 9, loglik = -168.626526
v+ B0 g( [3 t/ G- Oiteration 10, loglik = -167.387057+ j6 ?9 X- B6 c5 {
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
+ A* N& ]: D6 Y( ?/ K' S/ Iprior2 =
0.00007 s+ R) {# J: b, S
0.0000
9 D* S- r% T" i. e8 a: A5 M 1.0000
; w# ~5 U6 h9 a 0.0000$ c& w' H- p" p& v/ t I! M3 t
0.0000
" N8 p8 H2 x& `: [7 S* ptransmat2 =
0.0138 0.0089 0.7680 0.1060 0.1033
3 R: y0 {; |. P }1 [5 g 0.7811 0.0000 0.0199 0.0067 0.1923
2 \) M* ^$ Q. p 0.0000 0.9936 0.0000 0.0064 0.0000: `% N9 Z1 v m6 h* c+ M
0.1686 0.2604 0.2242 0.3398 0.0070
5 t3 V8 g* i2 ~4 U0 x8 v 0.0053 0.0406 0.8350 0.1184 0.0007 ' ?) m/ p' Y* ~ a0 ~9 P( e0 C
obsmat2 = 0.0000 0.2351 0.5738 0.0256 0.1118 0.0186 0.0351# |/ r9 N6 u2 l3 P; Q7 |
0.0000 0.8270 0.0000 0.0790 0.0256 0.0456 0.0228
4 J. X8 ^5 }3 n/ M. s 0.7514 0.0021 0.0011 0.0550 0.1472 0.0432 0.00007 w( I+ ^0 P. C- S
0.0014 0.4208 0.0447 0.4366 0.0023 0.0887 0.0055
1 S7 ?+ K" g5 _" C! X- n8 T$ d 0.0000 0.0784 0.3223 0.2014 0.0116 0.1525 0.2338 iteration 1, loglik = -277.738670
; q' s# ~6 _8 S# }iteration 2, loglik = -242.1632478 f9 _& [7 F' I
iteration 3, loglik = -238.321971
8 m, B0 J' q# T9 N3 f- Biteration 4, loglik = -233.1667468 M" G6 Q) B$ b
iteration 5, loglik = -225.6822596 s+ z2 h9 l5 b9 u( p' R
iteration 6, loglik = -214.560296- K! i. ?# Z n- r: f O/ T
iteration 7, loglik = -201.1820159 U. N2 B& T8 _/ c8 p& E l
iteration 8, loglik = -189.427453
/ ]1 p" G- ]9 s1 V3 D' [iteration 9, loglik = -179.156352
: C$ C6 Q! L+ ]) ^0 ?! V1 ?iteration 10, loglik = -171.744096
! y$ L8 w/ m" ?. G0 niteration 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 ) h( e; V6 x. B/ \2 Z T
prior4 = 0.0000
9 ?0 {! z7 m9 b# K; J( V$ V% W" q, ? 0.9982
$ p; j- f& [: ^ 0.0004
: {2 \/ D1 x# H. J 0.0014# k* ^# K) C# }% ~8 T3 H/ v. l
0.0000
. I0 c2 M+ O z$ Jtransmat4 =
0.0873 0.5277 0.2799 0.1007 0.0045
* n n# @* U0 e 0.0002 0.0000 0.0005 0.0000 0.9994; k+ c$ v" g: A- h3 {" T
0.0180 0.0000 0.0118 0.0011 0.9692/ {# i2 ^' V( g6 m
0.0436 0.0226 0.0810 0.0219 0.8310
4 h( Z2 L& h3 q7 p4 l 0.9746 0.0056 0.0003 0.0195 0.0000 8 w1 V3 _/ q4 S' I0 p4 O
obsmat4 = 0.0000 0.2012 0.5080 0.0580 0.1093 0.0465 0.07703 g4 o# o: c9 W; _" C' H
0.7939 0.0001 0.0000 0.0745 0.1277 0.0038 0.0000
" L! ~* h; b7 u0 V! b% W$ b% v 0.4120 0.1044 0.0049 0.1736 0.0032 0.3017 0.0001# W) q7 }5 z7 J5 W3 B
0.4527 0.0622 0.0637 0.2568 0.0549 0.0295 0.08020 o m/ h" r8 z0 w
0.0000 0.8172 0.0000 0.0943 0.0270 0.0389 0.0225 8 E2 h- O* \- s) T: R& j
data1 = 5 2 4 1 2 2 5 2 3 7 1 6 2
( i- } u# Y' Q, B# Zloglik =
-19.2351 , \" [2 f5 S6 J- T! Z& c1 n
loglik2 = -21.0715
! A. g% ^0 V) D/ w7 O$ rpath =
3 2 5 3 2 1 3 2 1 5 3 2 1
2 X) y2 ~" b% W3 mpath2 =
2 5 1 2 5 1 2 5 1 1 2 5 1
' v1 a% A2 U+ g5 A. B2 Zfuhe =
1 |