% ①定义一个HMM并训练这个HMM。* E' _3 I9 z7 V% {$ {
% ②用一组观察值测试这个HMM,计算该组观察值域HMM的匹配度。1 p0 s' ~) E! [& ]6 i" r
% 修改:旺齐齐5 \7 I; O7 l! ?4 A
% 修改部分为:添加 HMM2 模型。测试一个观察序列更加符合哪个哪个HMM模型。
1 B* L+ T# q, o, f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % O:观察状态数
- g# P" a3 W$ p8 HO = 7;* ^) h" c9 A1 C/ [5 q
O2 = 7;
) t' m, i! {$ F$ @& G- M, h% Q:HMM状态数3 n. Q/ Z1 C9 A
Q = 5;
, l* j6 {. v9 o' N" {: S+ ]! W/ J: JQ2 = 5;
1 P: c8 p6 c& E F$ D8 l% l%训练的数据集,每一行数据就是一组训练的观察值' u3 X1 Q& g1 C* C$ I. Y' D! Q: \
data=[1,2,3,1,2,2,4,2,3,1,2,7,2;. t% b: ~* S6 X5 u V
1,2,3,6,2,2,1,4,3,1,5,3,1;
1 C, p" ?9 @/ [6 n4 n, s9 f) ] 1,2,3,1,2,5,1,2,4,1,2,3,2;
$ \, D' V! ]/ S% O3 V 1,2,7,1,2,2,1,2,5,1,2,4,1;# Z/ d, ~( g3 F! l8 |8 F: R* p# L1 ]
5,2,3,3,5,2,1,2,3,1,2,3,6;& V9 A/ G* E' L7 j8 b- P4 N: c
1,2,3,1,2,2,1,6,5,1,2,6,4;
: Y* B2 I! b1 [$ u! X+ y6 i 5,2,3,4,4,2,1,2,3,1,2,5,6;4 e) ] m2 o E
1,2,6,1,2,2,1,2,3,1,4,3,2;
% F: {3 p7 w# t5 o2 n 1,2,3,4,2,7,1,4,3,1,7,3,3;
# u) I: P6 O- ]& ]2 O, i 5,2,3,5,2,2,1,2,3,1,2,3,4;
* l# x: E4 x0 r* e 5,2,4,1,2,2,5,2,3,7,1,6,2;] : `5 E: c8 X! i8 o& P
data2 = [1,2,3,1,2,2,4,2,3,1,2,7,2;
8 {9 S- z+ K( g( r! D( ] 1,2,3,6,2,2,1,4,3,1,5,3,1;
/ Y; }! k I* I- ?/ r1 S/ X* v 1,2,3,1,2,5,1,2,4,1,2,3,2;* L% I4 w+ {8 `; }
1,2,7,1,2,2,1,2,5,1,2,4,1;0 z n9 s) D0 P2 E
5,2,3,3,5,2,1,2,3,1,2,3,6;2 a& p' l6 _& _7 M }7 @
1,2,3,1,2,2,1,6,5,1,2,6,4;
7 M& g- v; p" ]1 S* A 5,2,3,4,4,2,1,2,3,1,2,5,6;4 d4 g; w" F n8 C
1,2,6,1,2,2,1,2,3,1,4,3,2;% _9 K' S4 y" e
1,2,3,4,2,7,1,4,3,1,7,3,3;
! ~& f' O, r: u- O 5,2,3,5,2,2,1,2,3,1,2,3,4;- U* F1 ?7 D% O
4,2,5,1,2,2,6,2,3,7,1,6,4;] % initial guess of parameters4 V% o& ^1 w Z) O. r- X- i+ x
% 初始化参数
) `( Q. m8 _" C2 q- oprior1 = normalise(rand(Q,1));. p7 h/ a' q& j, o- r/ S, T
transmat1 = mk_stochastic(rand(Q,Q));
& ^% v2 C* I8 ~obsmat1 = mk_stochastic(rand(Q,O)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%$ l7 N K7 ?* _- A/ k) @
% 添加部分* x# \ p" d) ?7 V# W
prior3 = normalise(rand(Q2,1));: ^2 i5 E. e/ t1 {7 M4 P
transmat3 = mk_stochastic(rand(Q2,Q2));+ [1 T' O/ a5 p1 d
obsmat3 = mk_stochastic(rand(Q2,O2));
, m) e1 u! j6 j3 [" `" `& T1 S z& n) m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % improve guess of parameters using EM
6 x3 I- b+ l! c% 用data数据集训练参数矩阵形成新的HMM模型
: I/ {4 x( s3 ?' f8 f/ [[LL, prior2, transmat2, obsmat2] = dhmm_em(data, prior1, transmat1, obsmat1, 'max_iter', size(data,1));
+ d; ]; g9 J" g7 `, d; a% 训练后那行观察值与HMM匹配度
: Y' j4 K$ U- C' f$ LLL
& l; K, J9 i: ]% 训练后的初始概率分布3 h) h$ k" M; q8 V& |8 |$ U g
prior2
% k) [' _0 k4 N# {4 q$ G; s% 训练后的状态转移概率矩阵" |7 v: L; J9 ~/ W9 A
transmat2
8 f- X ~* j- \* s1 O% 观察值概率矩阵
* O( J4 t k hobsmat2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3 T4 ?( q8 |8 f# L, U5 I) c" [% 添加部分) v! _# C! {% [2 h1 H- Y+ S3 V
[LL2, prior4, transmat4, obsmat4] = dhmm_em(data2, prior3, transmat3, obsmat3, 'max_iter', size(data2,1));
# s; J1 d" W* A' Q* R }5 e& z; k LL2! x# G8 g! L5 v
prior4
/ C) I8 F3 @* v6 ]% } transmat4
+ {0 f" [! d. I! `6 C7 l obsmat4! w& Y9 L% ?) Y6 T2 S# o
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % use model to compute log likelihood3 F6 q0 q2 n! a! f9 j3 h! [
% data1=[1,2,3,1,2,2,1,2,3,1,2,3,1]
6 m6 C: I, N. F: ^5 U" sdata1 = [5,2,4,1,2,2,5,2,3,7,1,6,2]
. e" c: H9 ~" Cloglik = dhmm_logprob(data1, prior2, transmat2, obsmat2)" Y! B" c5 e, h6 ^
% log lik is slightly different than LL(end), since it is computed after the final M step
( A. ^1 F O% r% loglik 代表着data和这个hmm(三参数为prior2, transmat2, obsmat2)的匹配值,越大说明越匹配,0为极大值。 % path为viterbi算法的结果,即最大概率path %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5 v Z5 \9 G$ ]5 j. ^& a% 添加部分' r# S& h N( o* p0 E
loglik2 = dhmm_logprob(data1, prior4, transmat4, obsmat4)5 O6 m5 R' [5 _
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
r: b. x( T0 }) vB = multinomial_prob(data1,obsmat2);! T) V. I" V: o$ L; F7 T4 s( _
path = viterbi_path(prior2, transmat2, B)4 d3 s: Z+ t% y/ r
save('sa.mat');
1 H' T; U) z; z; a%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ y% e/ ]% L# w( H( p; f% 添加部分7 _4 U! g& _( N4 q- u
B2 = multinomial_prob(data1,obsmat4);9 G, j" [! s$ L1 M) n c3 Z) Z
path2 = viterbi_path(prior4, transmat4, B2)1 i2 N% b7 F2 W$ v5 X# N; C W, k
save('sa2.mat');' O: N8 v* h! M3 p7 z1 t G
if loglik2 > loglik
/ _$ k( k, K" X$ d) z4 E; B fuhe = 2+ A) j) j. j& u5 _
else
& Z7 o$ }" o& M0 P6 J2 ~ fuhe = 1, P1 Z9 }7 n; R8 z, ?& b$ e
end , e7 D' B( @: b# {* q
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
------ 运行结果 ------ data = 1 2 3 1 2 2 4 2 3 1 2 7 2( k) T2 e9 I+ z' o. [; m
1 2 3 6 2 2 1 4 3 1 5 3 1
9 B2 c2 X0 [, A9 M1 T 1 2 3 1 2 5 1 2 4 1 2 3 2
6 J# \. k% U1 k" X8 {' |7 U 1 2 7 1 2 2 1 2 5 1 2 4 1
! E4 T* P4 w" y& `3 ] B 5 2 3 3 5 2 1 2 3 1 2 3 6
" n% U5 ]- W( Q: ` 1 2 3 1 2 2 1 6 5 1 2 6 4+ W- b A5 b! b3 Q9 G7 D3 m4 [
5 2 3 4 4 2 1 2 3 1 2 5 6
3 O9 \8 A9 i% B# E1 q7 h 1 2 6 1 2 2 1 2 3 1 4 3 2
; i% W0 `' U! M( z) P 1 2 3 4 2 7 1 4 3 1 7 3 3 j6 b' {1 v# ~1 l; K1 {6 e
5 2 3 5 2 2 1 2 3 1 2 3 4
: D5 L, `, L6 ^9 m; i0 K 5 2 4 1 2 2 5 2 3 7 1 6 2 ' G$ s3 z3 G/ L# R |2 v
data2 = 1 2 3 1 2 2 4 2 3 1 2 7 2
3 }' V9 L% r, e 1 2 3 6 2 2 1 4 3 1 5 3 14 y6 K1 o5 d+ u8 e6 g* F2 v; c
1 2 3 1 2 5 1 2 4 1 2 3 20 C/ i# S3 e1 k% }) e5 I* X" v3 t
1 2 7 1 2 2 1 2 5 1 2 4 1+ g- v' [- I7 X; X
5 2 3 3 5 2 1 2 3 1 2 3 6
8 S1 _, N2 I, j5 m5 x7 {3 Z 1 2 3 1 2 2 1 6 5 1 2 6 4& F# i$ x1 O5 u: o& t
5 2 3 4 4 2 1 2 3 1 2 5 6
6 B5 H* q- \* Z2 e 1 2 6 1 2 2 1 2 3 1 4 3 2
7 ]' X9 J9 @, C* q$ C 1 2 3 4 2 7 1 4 3 1 7 3 3
0 u) T' o& l0 O: M& x 5 2 3 5 2 2 1 2 3 1 2 3 4
3 ]6 v, {) a" n: s$ M- t1 S 4 2 5 1 2 2 6 2 3 7 1 6 4 iteration 1, loglik = -327.100465) q4 D6 |1 ]/ d7 T' w! l* O
iteration 2, loglik = -238.259812& E0 A) |- o3 X) x% K
iteration 3, loglik = -232.962948 g9 \; H+ B0 y1 x9 e# I C
iteration 4, loglik = -223.323891: r W, \' V t Z- L/ V4 a9 V
iteration 5, loglik = -207.630875
) ~, D) \* j1 x6 h- Citeration 6, loglik = -191.012697
) z1 Q* s, Z3 e+ d+ q2 F% hiteration 7, loglik = -178.611546
8 v* F( |. Z$ I/ Kiteration 8, loglik = -171.524132
- a. [0 S) x6 |4 [2 e g; B$ Piteration 9, loglik = -168.626526
, p. F) c3 m o* u# { Literation 10, loglik = -167.387057
/ i/ j# c- l% d x6 W% } z# o' {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
]: a9 b+ C, ~# l0 ~9 l5 k' Gprior2 =
0.0000
3 c$ y/ i5 g( P# G* I2 a 0.0000; A% a8 i9 C: j- y$ I) o6 G+ N/ z
1.0000
7 J$ q* g/ P" ^5 A 0.0000
/ c/ A8 M$ _: w 0.0000 " ~; Z, `9 S( n* [6 _
transmat2 = 0.0138 0.0089 0.7680 0.1060 0.1033+ C* _% h, A% B2 ^ Y4 f+ W+ S
0.7811 0.0000 0.0199 0.0067 0.1923
4 O# v( S/ ] |: W: g; o 0.0000 0.9936 0.0000 0.0064 0.0000
& y0 Y0 N8 L6 u$ Q$ A 0.1686 0.2604 0.2242 0.3398 0.0070
[$ L3 P6 ^ K5 R" u. k 0.0053 0.0406 0.8350 0.1184 0.0007 ' m+ z [, ^5 K* b8 u% Z+ S2 p& t* T
obsmat2 = 0.0000 0.2351 0.5738 0.0256 0.1118 0.0186 0.0351
; ^ P& O) f! T, Q( V 0.0000 0.8270 0.0000 0.0790 0.0256 0.0456 0.02286 v1 ~ V+ |5 N6 B4 j: ]$ E/ m
0.7514 0.0021 0.0011 0.0550 0.1472 0.0432 0.0000
3 L+ J0 T( O- A2 {7 A 0.0014 0.4208 0.0447 0.4366 0.0023 0.0887 0.0055
! d( }8 P( V7 d( m# a, v 0.0000 0.0784 0.3223 0.2014 0.0116 0.1525 0.2338 iteration 1, loglik = -277.738670- e8 y) D8 E ]
iteration 2, loglik = -242.163247
" T) Y: }/ `, O! J0 k. J, @" ?* Citeration 3, loglik = -238.321971
' b6 P0 M6 Z8 h" N4 Literation 4, loglik = -233.166746
9 o2 |- j# b( D2 M {" ]" miteration 5, loglik = -225.6822594 _) p7 g' r2 B* C
iteration 6, loglik = -214.560296 T% j. k3 u3 e9 U& J' r
iteration 7, loglik = -201.182015: U0 P" J% L- o- k' V( f
iteration 8, loglik = -189.427453; J% v# w9 g7 A/ Q$ }5 N2 K2 U
iteration 9, loglik = -179.156352
7 P* R7 O' \+ c9 G% w; T% m7 g/ j6 aiteration 10, loglik = -171.7440960 k, g# F. w6 U' h- T
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 / w d& p" \% f' W* M
prior4 = 0.0000& h( E% ^* c# v1 g1 D
0.9982
0 {. I1 a4 S) M7 q( R 0.0004
; K V7 l* a2 {2 _% C* F" U 0.0014/ R% U$ b8 f& _2 |* t/ a* F
0.0000
# v3 x, A( v! X. u; F/ dtransmat4 =
0.0873 0.5277 0.2799 0.1007 0.0045 \2 p% O/ C, b
0.0002 0.0000 0.0005 0.0000 0.9994
& ~& v) |% [5 Z$ g4 o 0.0180 0.0000 0.0118 0.0011 0.9692
: C3 r, a; d2 s+ S/ s! b' T. B 0.0436 0.0226 0.0810 0.0219 0.8310- u" m X* e4 u
0.9746 0.0056 0.0003 0.0195 0.0000
5 y0 E0 z4 k6 ^5 _obsmat4 =
0.0000 0.2012 0.5080 0.0580 0.1093 0.0465 0.0770) [( q! n+ [, @9 }/ H
0.7939 0.0001 0.0000 0.0745 0.1277 0.0038 0.0000( W5 U( t& b H( L& I
0.4120 0.1044 0.0049 0.1736 0.0032 0.3017 0.0001. E2 C7 m G/ g6 {1 P) `
0.4527 0.0622 0.0637 0.2568 0.0549 0.0295 0.0802
- t; C) k( S3 K; z U; Q/ s! ` 0.0000 0.8172 0.0000 0.0943 0.0270 0.0389 0.0225
* R2 s6 _+ f& f' f/ [, B( L7 C! cdata1 =
5 2 4 1 2 2 5 2 3 7 1 6 2 : [3 K0 I7 U$ Y3 L
loglik = -19.2351
) R1 V2 m8 H9 Q6 xloglik2 =
-21.0715
: D# H+ s; q w. F: [ Gpath =
3 2 5 3 2 1 3 2 1 5 3 2 1
9 d2 Y2 T9 v* Y* g# zpath2 =
2 5 1 2 5 1 2 5 1 1 2 5 1 1 H" X: T1 i" \
fuhe = 1 |