% ①定义一个HMM并训练这个HMM。/ ?& f d8 N) B. r0 U& ^ _/ c
% ②用一组观察值测试这个HMM,计算该组观察值域HMM的匹配度。7 N v/ |8 O0 z+ J2 \
% 修改:旺齐齐/ N$ v+ l5 O& l$ C* ^
% 修改部分为:添加 HMM2 模型。测试一个观察序列更加符合哪个哪个HMM模型。8 K$ V ]0 j9 M, g" C* `; Z
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % O:观察状态数
4 K: C# S" \& |1 B, YO = 7;& L( L, H' W8 a9 T+ K |' X8 |
O2 = 7;
8 X% S' c v% J5 e& _' K% Q:HMM状态数! b* w1 W" D* q! |
Q = 5;" v9 u) m5 h1 P) r
Q2 = 5;
1 Q1 Q+ S* B3 u# |3 a! J% v5 E3 w%训练的数据集,每一行数据就是一组训练的观察值$ R$ l, [4 R1 l; M
data=[1,2,3,1,2,2,4,2,3,1,2,7,2;
( V- i7 |* X: s9 ]: Q8 X5 @- _6 l 1,2,3,6,2,2,1,4,3,1,5,3,1;: V( j) V- S! F4 j* i: D" O0 p L
1,2,3,1,2,5,1,2,4,1,2,3,2;" Z* [7 D6 y6 v6 C2 b0 E
1,2,7,1,2,2,1,2,5,1,2,4,1;
6 X# }5 R+ @/ b$ G2 [ 5,2,3,3,5,2,1,2,3,1,2,3,6;
8 [, @& `4 L/ ]2 y3 [ 1,2,3,1,2,2,1,6,5,1,2,6,4;* x# T9 J! {$ |- D/ X
5,2,3,4,4,2,1,2,3,1,2,5,6;( {9 _9 u1 p* k; |" E4 S |/ U
1,2,6,1,2,2,1,2,3,1,4,3,2;: f1 ] T2 D& e9 l2 l5 e9 W
1,2,3,4,2,7,1,4,3,1,7,3,3;
5 S' A( B) J& G( V, Y- S0 \1 h q 5,2,3,5,2,2,1,2,3,1,2,3,4;
3 }# D, [ y; \6 ` 5,2,4,1,2,2,5,2,3,7,1,6,2;]
8 P! B9 w4 d5 Y7 n! ^ data2 = [1,2,3,1,2,2,4,2,3,1,2,7,2;
) K4 \, y% \* |3 o e$ P/ Q" k! Y 1,2,3,6,2,2,1,4,3,1,5,3,1;
: c+ A( M. d. m9 B 1,2,3,1,2,5,1,2,4,1,2,3,2;
O2 }% V2 e. p5 A2 u* d0 {3 o2 B 1,2,7,1,2,2,1,2,5,1,2,4,1;, l- E4 I+ T; |6 T0 `
5,2,3,3,5,2,1,2,3,1,2,3,6;
% V0 u+ H. M) a3 r7 K 1,2,3,1,2,2,1,6,5,1,2,6,4;7 E, @& [; I: S7 b% p3 m/ M/ o
5,2,3,4,4,2,1,2,3,1,2,5,6;4 L! K/ C3 k# O8 X
1,2,6,1,2,2,1,2,3,1,4,3,2;
2 d! |8 j. A7 M* k2 v6 w& b 1,2,3,4,2,7,1,4,3,1,7,3,3;
/ K) f% n7 `) k. `5 @ B 5,2,3,5,2,2,1,2,3,1,2,3,4;
% p& \4 s7 O4 w! }: \% A5 E 4,2,5,1,2,2,6,2,3,7,1,6,4;]
% initial guess of parameters
$ k: Q7 y) O4 K0 S% 初始化参数
$ V/ G& r3 f8 {7 Uprior1 = normalise(rand(Q,1));
4 f ~) b) b t7 Rtransmat1 = mk_stochastic(rand(Q,Q));
6 [7 r7 x; X" m8 G" z9 o' \obsmat1 = mk_stochastic(rand(Q,O)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%- w0 @4 R; B8 v: ~
% 添加部分
( w& D' x+ ]8 a! X: P9 x0 X" c, p( w0 D prior3 = normalise(rand(Q2,1));
$ U# `# w& i* S7 H3 f; Z% d transmat3 = mk_stochastic(rand(Q2,Q2)); a0 O, T# S- O
obsmat3 = mk_stochastic(rand(Q2,O2));
1 C5 z3 C5 r* X* n+ {7 b' U%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % improve guess of parameters using EM% {& O7 r. P8 L4 Y6 l+ V
% 用data数据集训练参数矩阵形成新的HMM模型; X& r5 p0 [, `' x
[LL, prior2, transmat2, obsmat2] = dhmm_em(data, prior1, transmat1, obsmat1, 'max_iter', size(data,1));
6 \) E) ~1 d+ N: n% 训练后那行观察值与HMM匹配度4 B+ V# _% G3 Q
LL
6 d$ B% O$ p; D$ d5 s% 训练后的初始概率分布# d! g6 Y( [8 g9 a
prior2 E p7 x8 s p0 F
% 训练后的状态转移概率矩阵
# |1 X- c- i! h" F' Ptransmat2" S. D8 h3 G) o! u. |, |& B) y6 p
% 观察值概率矩阵
2 x; F/ ^: D# a$ F) c" Oobsmat2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%* Z5 k& X+ ~: D2 B& C8 Z/ X! S
% 添加部分! x$ V" |, |: ^
[LL2, prior4, transmat4, obsmat4] = dhmm_em(data2, prior3, transmat3, obsmat3, 'max_iter', size(data2,1));( S4 j' A. `) b: J, U* h {0 T6 ]
LL2- R0 F% p. w9 \2 H; c# w" v
prior4# ?/ B: o3 P! i
transmat44 Y% [0 C& C$ p+ I# C) f
obsmat4
, B8 j. G) p3 a/ R) [%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % use model to compute log likelihood
: P! w/ ?' p) t% data1=[1,2,3,1,2,2,1,2,3,1,2,3,1]3 R2 K( P/ f ?( v
data1 = [5,2,4,1,2,2,5,2,3,7,1,6,2]3 s6 U1 N/ C2 Z! |" X9 O( i5 g7 H3 x
loglik = dhmm_logprob(data1, prior2, transmat2, obsmat2)
; B5 Y z+ k( R% log lik is slightly different than LL(end), since it is computed after the final M step
* \- _* ?0 l1 F; d. f/ W5 |% loglik 代表着data和这个hmm(三参数为prior2, transmat2, obsmat2)的匹配值,越大说明越匹配,0为极大值。 % path为viterbi算法的结果,即最大概率path %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 C% n) b) U! n
% 添加部分
, F. A$ ?: ], Iloglik2 = dhmm_logprob(data1, prior4, transmat4, obsmat4)3 C; h o/ V* U# Y
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 2 H# T9 s( I; M2 S9 ]2 O0 S
B = multinomial_prob(data1,obsmat2);
5 {5 A& Q6 q1 z8 C D3 Opath = viterbi_path(prior2, transmat2, B)* k: c- T2 B3 {9 M V8 i
save('sa.mat'); # q5 Q" C( i( {6 @/ D
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%# e3 W1 ]$ l* x b4 }- g
% 添加部分
9 G, J/ {: e+ b, H& }" e+ F! T+ { B2 = multinomial_prob(data1,obsmat4);
7 ~, j; w2 M, h( ^% j! T path2 = viterbi_path(prior4, transmat4, B2)) m; I5 U! w- p
save('sa2.mat');
( j6 l+ W. M& }% n if loglik2 > loglik " x; @7 K. ^1 K+ K
fuhe = 2
( d$ d) v$ y; E else* B. s2 R2 S' \( b3 N5 ]1 v, e
fuhe = 13 e5 B q9 o4 w4 {
end
# v% t7 n0 G% }) l7 X) [1 Q%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ------ 运行结果 ------ data = 1 2 3 1 2 2 4 2 3 1 2 7 2) l/ A B! H, V; J
1 2 3 6 2 2 1 4 3 1 5 3 1' {3 R; R) `: d1 L, E
1 2 3 1 2 5 1 2 4 1 2 3 2
1 B; r9 b [+ w. J% E7 a5 }2 ^ 1 2 7 1 2 2 1 2 5 1 2 4 1
8 a: W1 K+ @4 Z4 F& V 5 2 3 3 5 2 1 2 3 1 2 3 6
. |. P6 A2 K! w/ T1 @7 r 1 2 3 1 2 2 1 6 5 1 2 6 4' |$ ? b( o. A
5 2 3 4 4 2 1 2 3 1 2 5 6
9 \2 \6 Z1 w: { 1 2 6 1 2 2 1 2 3 1 4 3 22 W' ?; v% j t; q- @0 j
1 2 3 4 2 7 1 4 3 1 7 3 3
1 w+ [% ?+ j5 O2 v% e 5 2 3 5 2 2 1 2 3 1 2 3 4
$ t) a& V3 @" `7 D 5 2 4 1 2 2 5 2 3 7 1 6 2
! B# }/ I* @% odata2 =
1 2 3 1 2 2 4 2 3 1 2 7 2
8 p' G5 ~- R7 Y; Z+ ?! N 1 2 3 6 2 2 1 4 3 1 5 3 1
& S8 f' c7 y" n3 q% }& Z) g 1 2 3 1 2 5 1 2 4 1 2 3 2! i% d. J% v8 k0 w
1 2 7 1 2 2 1 2 5 1 2 4 1
a4 {0 G* H' z$ I$ c x$ U 5 2 3 3 5 2 1 2 3 1 2 3 6
( A* @! M! e% q8 v8 M 1 2 3 1 2 2 1 6 5 1 2 6 4
! k) p( v+ U% ^$ J 5 2 3 4 4 2 1 2 3 1 2 5 6/ ?7 q. c/ A* p* w5 b/ e3 s7 {
1 2 6 1 2 2 1 2 3 1 4 3 2& U- W) m! Q1 E4 V
1 2 3 4 2 7 1 4 3 1 7 3 3
' E* p4 K0 F0 v7 N 5 2 3 5 2 2 1 2 3 1 2 3 4' S S( l* {" Z3 x' S/ [
4 2 5 1 2 2 6 2 3 7 1 6 4 iteration 1, loglik = -327.1004657 L' _% G% S, u; n8 b9 l
iteration 2, loglik = -238.259812
1 O6 a5 g4 \; N+ a- G: l Literation 3, loglik = -232.962948
. c& w$ F2 r) _* v# Uiteration 4, loglik = -223.3238918 P) O4 W+ g" a/ f9 ~1 T! h; R3 ^
iteration 5, loglik = -207.630875) P4 ]4 c# K% Z& u+ I" f1 B
iteration 6, loglik = -191.012697
6 t- a! K. a6 L( B9 hiteration 7, loglik = -178.611546
7 u" M, A2 c0 j. ^4 p9 a- ^/ F. m/ Miteration 8, loglik = -171.524132
! b( M0 X7 R' @" P6 E1 Kiteration 9, loglik = -168.626526
. [: h' r3 X- s' l+ @+ |iteration 10, loglik = -167.387057
7 L# K' R0 N3 P. _; xiteration 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
" `/ L' p- U. W4 g" {; nprior2 =
0.0000
0 n- G5 i0 Z6 ]) M 0.0000
2 c- Y5 n |) d4 w. Y 1.00008 J# ~' `* P) x, a4 A- J
0.0000" t% `2 w m. a3 h, }: a
0.0000
9 A9 l" u4 e* v" M8 Y! S( s$ j' U" Xtransmat2 =
0.0138 0.0089 0.7680 0.1060 0.1033
* `* ? d0 q0 B U$ E5 ~' R# d6 K 0.7811 0.0000 0.0199 0.0067 0.1923' o) F P X8 S1 N. i1 x( e9 D+ x
0.0000 0.9936 0.0000 0.0064 0.0000: ^( G+ n% [& r7 @
0.1686 0.2604 0.2242 0.3398 0.0070
9 |* Z g' X2 m9 b) I 0.0053 0.0406 0.8350 0.1184 0.0007
( M+ K `: _0 m# _. @& W: n( \obsmat2 =
0.0000 0.2351 0.5738 0.0256 0.1118 0.0186 0.03511 e& }3 k8 {5 j: g- m" o' z
0.0000 0.8270 0.0000 0.0790 0.0256 0.0456 0.0228
. d4 Y( f! A4 {: }6 N5 D6 I* e 0.7514 0.0021 0.0011 0.0550 0.1472 0.0432 0.00009 `) q( v; O6 H7 `
0.0014 0.4208 0.0447 0.4366 0.0023 0.0887 0.0055
8 s, D0 i6 V0 S5 u/ J T/ |# Z6 N 0.0000 0.0784 0.3223 0.2014 0.0116 0.1525 0.2338 iteration 1, loglik = -277.738670: u' M4 u5 I( j5 o# N, H* Y
iteration 2, loglik = -242.163247* d' T% c0 k& [5 }, ]& l
iteration 3, loglik = -238.321971
9 D8 m; _" ]4 X7 O p1 f8 Diteration 4, loglik = -233.1667464 p y9 \5 R. U+ C0 v1 X
iteration 5, loglik = -225.682259" r$ R9 E. @% C, h2 Q' t
iteration 6, loglik = -214.560296
- K# V) b1 m2 ]# y- {. `: _iteration 7, loglik = -201.182015$ s" X8 m7 g. M8 T# o3 Z
iteration 8, loglik = -189.427453! g/ V2 D; B3 R X
iteration 9, loglik = -179.156352
% {7 ~+ L R- }+ Viteration 10, loglik = -171.744096
- T! |- ^( S7 L" a- ~/ a# z, kiteration 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 ( e" C# K/ ^! |1 i' U8 Z7 K# c
prior4 = 0.0000: N1 Y$ k" F, R- x
0.9982+ h3 ^" |+ ?' x) Y, p& ~, y
0.0004
9 o6 r$ O2 N, [1 r: Y V) l 0.0014
! i! X: Q2 M2 F2 Q 0.0000
/ W8 Z+ O) J) |9 T% Q6 Mtransmat4 =
0.0873 0.5277 0.2799 0.1007 0.00452 n2 h9 Z- x5 q/ [2 B% {
0.0002 0.0000 0.0005 0.0000 0.9994
( D+ M% O0 m# Q B3 t8 Q 0.0180 0.0000 0.0118 0.0011 0.9692! I6 ?' z9 f9 W* X" c
0.0436 0.0226 0.0810 0.0219 0.8310 L6 u8 E4 _; g" l5 L+ G+ \; U
0.9746 0.0056 0.0003 0.0195 0.0000
$ y' W' _3 ]8 E" B9 lobsmat4 =
0.0000 0.2012 0.5080 0.0580 0.1093 0.0465 0.0770- ~$ j( N( }5 U
0.7939 0.0001 0.0000 0.0745 0.1277 0.0038 0.0000& e! W3 Q7 j/ e4 V) E- m
0.4120 0.1044 0.0049 0.1736 0.0032 0.3017 0.00015 r' h/ e0 j6 V9 V$ J" G
0.4527 0.0622 0.0637 0.2568 0.0549 0.0295 0.08022 q, H: c6 A: c6 X4 r+ W
0.0000 0.8172 0.0000 0.0943 0.0270 0.0389 0.0225
# z- q7 _0 F0 n I, b$ h, odata1 =
5 2 4 1 2 2 5 2 3 7 1 6 2 3 L5 ~1 _& _) d2 I# s
loglik = -19.2351 3 K# J$ t! t( e+ O5 `1 A
loglik2 = -21.0715 ' |0 ]6 d+ R ?" U* ?
path = 3 2 5 3 2 1 3 2 1 5 3 2 1
$ U) J4 X8 k0 ]. t/ G% @path2 =
2 5 1 2 5 1 2 5 1 1 2 5 1 / F$ ?! P8 K$ D! y) L, w
fuhe = 1 |