% ①定义一个HMM并训练这个HMM。
3 I+ r' g( M- a w6 @! R+ [) T% ②用一组观察值测试这个HMM,计算该组观察值域HMM的匹配度。
+ s2 ~6 [# l# W8 M/ A6 x: \% 修改:旺齐齐
1 e7 B8 V! ^) |" t' Y& a4 Q% 修改部分为:添加 HMM2 模型。测试一个观察序列更加符合哪个哪个HMM模型。
8 F2 @8 q/ v+ T, v7 e; b%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % O:观察状态数7 I$ m4 M+ U5 Z, t7 n
O = 7;
/ }. g9 W+ n5 b% x# p! {O2 = 7;+ g0 Z& }+ V/ K! c
% Q:HMM状态数
3 H) }' ?5 |0 s% s' n. g9 ?! B8 QQ = 5;
# F( H+ B( x: OQ2 = 5;+ _( |% q8 t o; w0 G z* B" L( {
%训练的数据集,每一行数据就是一组训练的观察值
' ?9 }$ V4 ]9 M( h' q% \3 Kdata=[1,2,3,1,2,2,4,2,3,1,2,7,2;
3 V! X; H6 u7 j 1,2,3,6,2,2,1,4,3,1,5,3,1;4 X9 ~; t8 V: [3 _2 H
1,2,3,1,2,5,1,2,4,1,2,3,2;3 A$ u2 d( o3 @
1,2,7,1,2,2,1,2,5,1,2,4,1; d/ ]* d- j1 q2 m& c8 L! {. M6 p
5,2,3,3,5,2,1,2,3,1,2,3,6;
3 T5 ?0 E2 h: ~2 ~5 L5 k: h 1,2,3,1,2,2,1,6,5,1,2,6,4;
7 |0 N- e6 U* i' N7 E 5,2,3,4,4,2,1,2,3,1,2,5,6;
5 K' |; h; _0 K) k4 \ 1,2,6,1,2,2,1,2,3,1,4,3,2;
+ m% V4 t- v3 H1 ~) t) l 1,2,3,4,2,7,1,4,3,1,7,3,3;
" O8 f1 ~2 L- A0 A; ]. h: r 5,2,3,5,2,2,1,2,3,1,2,3,4;- r3 ^9 y6 c1 N& N2 D/ ]7 o
5,2,4,1,2,2,5,2,3,7,1,6,2;]
# v( D# x b& h/ ]$ y: }8 m0 E data2 = [1,2,3,1,2,2,4,2,3,1,2,7,2;
% T2 F; q. A! s) n& n7 D* E T/ x 1,2,3,6,2,2,1,4,3,1,5,3,1;1 v4 m5 Q% b. }, \
1,2,3,1,2,5,1,2,4,1,2,3,2;* W9 r7 S# ^. F% [% L: h
1,2,7,1,2,2,1,2,5,1,2,4,1;
5 D+ u; R; d: \% x7 O; o 5,2,3,3,5,2,1,2,3,1,2,3,6;7 @, F3 A2 W+ d
1,2,3,1,2,2,1,6,5,1,2,6,4;0 h% A9 |0 N" R, ~7 z7 r* e! K
5,2,3,4,4,2,1,2,3,1,2,5,6; o, v) r" h4 K- x# G4 G* |
1,2,6,1,2,2,1,2,3,1,4,3,2;* Z/ o7 V2 L/ A6 b+ l2 g* D
1,2,3,4,2,7,1,4,3,1,7,3,3;
% [. Q* x8 V. W6 S- }2 T# ] 5,2,3,5,2,2,1,2,3,1,2,3,4;8 [" M7 v, o0 j# m* ~+ f/ E
4,2,5,1,2,2,6,2,3,7,1,6,4;]
% initial guess of parameters. ~" }0 x% \9 A, ~, E
% 初始化参数9 X( P2 N7 f! Z4 x1 D
prior1 = normalise(rand(Q,1));
$ M( B/ D9 N7 z$ A- y2 y' Ntransmat1 = mk_stochastic(rand(Q,Q));
; J1 Q9 ?, n4 a- T0 {3 @2 lobsmat1 = mk_stochastic(rand(Q,O)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%" q4 [: M/ L3 Q8 p0 @
% 添加部分
, t) x& {8 `3 ~9 S+ P- \ prior3 = normalise(rand(Q2,1));
4 R r) c, Z! F* @( A9 A transmat3 = mk_stochastic(rand(Q2,Q2));/ M5 y5 r: ]& b& }$ c- P
obsmat3 = mk_stochastic(rand(Q2,O2));
. t9 N9 F5 N* |4 ?3 ?%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % improve guess of parameters using EM
( b' t$ ?% N/ `; k" p/ n% 用data数据集训练参数矩阵形成新的HMM模型$ j n; }- _# O" Y7 A/ [: R( E
[LL, prior2, transmat2, obsmat2] = dhmm_em(data, prior1, transmat1, obsmat1, 'max_iter', size(data,1)); b$ Z0 T; Y. v7 Q1 Y5 w; ]
% 训练后那行观察值与HMM匹配度. X- Q" ^$ ^4 |6 P/ X
LL
6 V1 U7 o6 Z0 k& W/ R* p" A/ P% 训练后的初始概率分布
; z+ |% l+ b* k0 e* d. dprior2
; O7 F0 ]+ v: k5 \% 训练后的状态转移概率矩阵4 l F: _& P8 C k6 e' _4 K
transmat2
S4 u L6 q4 f; }& S2 b% 观察值概率矩阵
1 \( n0 X, n# K& H& Q9 R5 E/ _obsmat2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%. f5 O* u# q+ d% B! H' E. {! T, q
% 添加部分3 h |3 x% M7 P9 O
[LL2, prior4, transmat4, obsmat4] = dhmm_em(data2, prior3, transmat3, obsmat3, 'max_iter', size(data2,1));/ W7 P1 w( e5 F8 e6 N
LL2; J0 E. E8 A; a" A! n Z% w8 X5 [
prior4) Z4 n' Q, z$ {4 g1 Y
transmat4
# J& _- f+ O( M2 x; ~& N Z5 o obsmat4* I l& |# J9 {. X- b' K+ o
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % use model to compute log likelihood
) b- l2 Q G" l8 M4 [% data1=[1,2,3,1,2,2,1,2,3,1,2,3,1]
: ?0 s1 s# q3 |! `data1 = [5,2,4,1,2,2,5,2,3,7,1,6,2]/ {/ j1 {) [$ a" W7 c. O8 I( O
loglik = dhmm_logprob(data1, prior2, transmat2, obsmat2)
- u7 x7 D+ H# Z; s; t, b: N% log lik is slightly different than LL(end), since it is computed after the final M step
9 t- J/ \. Q* @7 p Q% \- q% loglik 代表着data和这个hmm(三参数为prior2, transmat2, obsmat2)的匹配值,越大说明越匹配,0为极大值。 % path为viterbi算法的结果,即最大概率path %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 L; y8 E+ x& F N1 b
% 添加部分
" r1 L( ?2 r7 A* p) ]loglik2 = dhmm_logprob(data1, prior4, transmat4, obsmat4)+ @( E3 { i# y* _, B+ T
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 5 H" p4 i$ r- X c& z
B = multinomial_prob(data1,obsmat2);
$ x$ t/ x1 ^8 _# C! L0 Kpath = viterbi_path(prior2, transmat2, B)! u. n9 R5 w, k
save('sa.mat');
) s. s2 _' g* @ j, I%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%- n4 F, k. @, F6 a) Q% I
% 添加部分# F' {8 L% V- S: U. G
B2 = multinomial_prob(data1,obsmat4);
7 M0 c3 E: V j i; i path2 = viterbi_path(prior4, transmat4, B2)8 Q [1 {* ?1 r2 {7 r/ i
save('sa2.mat');
- D$ J+ b$ n7 u' X if loglik2 > loglik ! c2 \' s* y% b3 v6 a
fuhe = 2* r2 a$ m9 h4 _2 b/ u. V+ O
else5 x; _9 J; Y) T7 N I3 ]
fuhe = 1/ w9 P; V, g) c% w! }
end 5 D& o) ~0 v0 o7 K
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
------ 运行结果 ------ data = 1 2 3 1 2 2 4 2 3 1 2 7 2% H$ l) p- V4 [# A
1 2 3 6 2 2 1 4 3 1 5 3 12 |* R C- A: p$ _0 M9 X
1 2 3 1 2 5 1 2 4 1 2 3 2$ J7 m j- l# s/ V6 ]7 k% l
1 2 7 1 2 2 1 2 5 1 2 4 1& {. {" L2 U# t+ {2 P9 D0 ~
5 2 3 3 5 2 1 2 3 1 2 3 6
+ w% \$ R, P8 | `* s, g7 g 1 2 3 1 2 2 1 6 5 1 2 6 44 m7 I* Z! ^* e
5 2 3 4 4 2 1 2 3 1 2 5 6/ L5 z9 B4 A* n& @: D9 G, n" h) B/ u
1 2 6 1 2 2 1 2 3 1 4 3 2$ N( S1 [) i) c8 H5 M& L: A
1 2 3 4 2 7 1 4 3 1 7 3 3
* ^( j8 y3 J6 f, m 5 2 3 5 2 2 1 2 3 1 2 3 4
1 w7 `+ r: `; U2 {. o6 C* `+ O 5 2 4 1 2 2 5 2 3 7 1 6 2 ' b: q+ }) L2 m4 Z! \ S9 a
data2 = 1 2 3 1 2 2 4 2 3 1 2 7 2$ }. v \* m+ }# K8 n9 |
1 2 3 6 2 2 1 4 3 1 5 3 1% P9 u! q y# N: \2 v, B" Y& t" n
1 2 3 1 2 5 1 2 4 1 2 3 23 ?: V k# u9 J) t8 C( }
1 2 7 1 2 2 1 2 5 1 2 4 1/ p3 z8 w g4 I6 B; b- h
5 2 3 3 5 2 1 2 3 1 2 3 6
# U5 |$ E; W+ F0 Q 1 2 3 1 2 2 1 6 5 1 2 6 4& J, G+ y2 I: ?7 c3 d0 M7 |
5 2 3 4 4 2 1 2 3 1 2 5 6: g* {) J/ W5 ]% [
1 2 6 1 2 2 1 2 3 1 4 3 2
/ E# q0 a! A0 a- x; @* z 1 2 3 4 2 7 1 4 3 1 7 3 3
( i$ O- f( v7 Q8 V 5 2 3 5 2 2 1 2 3 1 2 3 4/ c: }8 k% x9 e* ]% j0 h3 M
4 2 5 1 2 2 6 2 3 7 1 6 4 iteration 1, loglik = -327.100465
5 a6 E; n- H; R, p$ g4 n+ H( hiteration 2, loglik = -238.259812! i" {, T; v- D3 R
iteration 3, loglik = -232.962948
v8 R C. @1 L2 a, Uiteration 4, loglik = -223.323891$ W# m3 G* g J9 x8 D
iteration 5, loglik = -207.630875
# V5 g2 t( D/ j1 s' D# i4 P; y) Qiteration 6, loglik = -191.012697
. z- L6 H- z! ?; Witeration 7, loglik = -178.611546
9 q0 F- D3 v& V0 Y* y0 H& niteration 8, loglik = -171.524132
, ~8 `' @ R. P$ Giteration 9, loglik = -168.6265263 D; a B$ v% i) @( u
iteration 10, loglik = -167.3870571 D; O; @; S2 P) T8 `: G0 k: X# q
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
1 \4 I9 a1 Q2 ~5 i. I" F3 Mprior2 =
0.0000/ X. a$ g7 C+ {7 Y3 G7 [
0.0000- C1 E! K* N- i7 O) b, d) m5 p
1.0000
; ^* E3 K7 N2 J8 Z" X- z4 | o' p 0.0000
4 ^! }2 P8 E5 Q6 p8 | 0.0000 ( e& b' D/ s8 ]! |6 W
transmat2 = 0.0138 0.0089 0.7680 0.1060 0.1033 c& ?0 A) z/ G0 n5 z ^
0.7811 0.0000 0.0199 0.0067 0.1923: f# \: C7 ]5 I: n
0.0000 0.9936 0.0000 0.0064 0.0000/ \ R; F4 y! A4 D k3 C8 Q
0.1686 0.2604 0.2242 0.3398 0.0070) a7 B8 N2 }; Z% M: W ~! \2 O) ^
0.0053 0.0406 0.8350 0.1184 0.0007
# S9 @8 d- F; i% @' }obsmat2 =
0.0000 0.2351 0.5738 0.0256 0.1118 0.0186 0.0351
" q' w, ^7 ]4 {, i 0.0000 0.8270 0.0000 0.0790 0.0256 0.0456 0.0228+ D/ S; h; f1 _" Q2 M; v
0.7514 0.0021 0.0011 0.0550 0.1472 0.0432 0.0000
- X H& J3 B/ h 0.0014 0.4208 0.0447 0.4366 0.0023 0.0887 0.0055
8 H& c/ v5 t, g2 C, A1 v 0.0000 0.0784 0.3223 0.2014 0.0116 0.1525 0.2338 iteration 1, loglik = -277.738670
; y- }8 Z, O) L0 K* g: J4 piteration 2, loglik = -242.163247
8 W% ^1 }" n& K9 \iteration 3, loglik = -238.321971* h! z4 R( a4 T: d$ {! M: |4 `
iteration 4, loglik = -233.166746+ X9 F8 o$ Y; Z0 U
iteration 5, loglik = -225.682259
" Y' n6 u% S- Q! Z3 Kiteration 6, loglik = -214.560296" D2 D2 J5 ]! c) R- n) n4 ]( x
iteration 7, loglik = -201.182015
7 E- D3 g# z3 v! ~/ t; t4 z" fiteration 8, loglik = -189.4274531 N" P0 q5 l; s8 @( p* f, ^3 `
iteration 9, loglik = -179.156352
/ O, i0 ]# L X* w: v4 x3 l! [iteration 10, loglik = -171.744096! J( g3 i3 x3 `
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 * K1 w( {* A- u8 f7 D7 [
prior4 = 0.0000
$ |3 v& Z- a' t. j Y& m. Q 0.9982! f- e5 m l: v3 O
0.0004' [7 A6 \3 ?5 h
0.0014
; Z8 O. K. E5 m b 0.0000
) _) R+ X$ A+ M5 C3 utransmat4 =
0.0873 0.5277 0.2799 0.1007 0.00456 p, M# y7 O: z8 }6 E0 l7 x
0.0002 0.0000 0.0005 0.0000 0.9994- O* \% P, p" g- R: N
0.0180 0.0000 0.0118 0.0011 0.9692& c+ q* I3 e( Y/ }
0.0436 0.0226 0.0810 0.0219 0.83108 _+ O. ]; C" r6 w
0.9746 0.0056 0.0003 0.0195 0.0000
9 y5 s; i) f l* Hobsmat4 =
0.0000 0.2012 0.5080 0.0580 0.1093 0.0465 0.0770
- W: p% j o7 A8 h" I3 \& _* A0 Q 0.7939 0.0001 0.0000 0.0745 0.1277 0.0038 0.0000
# ^) E( D/ ~7 [5 Y 0.4120 0.1044 0.0049 0.1736 0.0032 0.3017 0.0001+ H! B E( v( g- t* v! E
0.4527 0.0622 0.0637 0.2568 0.0549 0.0295 0.0802
: c( T( g# H. [6 k 0.0000 0.8172 0.0000 0.0943 0.0270 0.0389 0.0225 5 m4 J5 s; o- @
data1 = 5 2 4 1 2 2 5 2 3 7 1 6 2
7 y1 L* v2 k$ B* a7 O& e" C sloglik =
-19.2351 $ T* S, ~, o7 ]% I+ a. F5 h: H
loglik2 = -21.0715
' i& |, ^% c3 F' Zpath =
3 2 5 3 2 1 3 2 1 5 3 2 1
4 t( ~# K1 D; G3 M, k0 L- Apath2 =
2 5 1 2 5 1 2 5 1 1 2 5 1
" ?9 M$ Q! K$ @* tfuhe =
1 |