% ①定义一个HMM并训练这个HMM。: V! k6 D: F! r3 [! z Y; H
% ②用一组观察值测试这个HMM,计算该组观察值域HMM的匹配度。+ O$ A$ i! T! V2 d9 F+ \# L8 ~0 i( J, T
% 修改:旺齐齐
' R: i. O% }/ l+ O. I8 s# A% 修改部分为:添加 HMM2 模型。测试一个观察序列更加符合哪个哪个HMM模型。
& y/ w: A. t5 x%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % O:观察状态数5 H; ?6 y5 h+ `6 k7 u0 p ?8 n3 K
O = 7;
* ?+ ~, u+ ~9 L' WO2 = 7;
. h3 C3 q$ m7 u3 g% C% Q:HMM状态数
4 {0 L- i% G5 I! ]Q = 5;
/ a- f' ]( a; L5 v# N, q" S1 QQ2 = 5;( Q7 i6 M$ \& e1 I) r8 v
%训练的数据集,每一行数据就是一组训练的观察值
, ]# @7 K( k% j" W0 rdata=[1,2,3,1,2,2,4,2,3,1,2,7,2;) j' m# P( h3 H% Y
1,2,3,6,2,2,1,4,3,1,5,3,1;' X# M& t9 o: }; L( U6 L5 T8 F- a
1,2,3,1,2,5,1,2,4,1,2,3,2;4 L' D8 q7 ^8 k" A( x
1,2,7,1,2,2,1,2,5,1,2,4,1;( j$ V* Y4 w; d& K
5,2,3,3,5,2,1,2,3,1,2,3,6;. X% n% b8 z( z) W
1,2,3,1,2,2,1,6,5,1,2,6,4;
# D9 S) }: ~5 J/ K& @" U4 j4 r 5,2,3,4,4,2,1,2,3,1,2,5,6;
( {0 W- E, ~, K) e% P% S 1,2,6,1,2,2,1,2,3,1,4,3,2;! f3 Q2 \' d/ k- X4 w2 m9 q
1,2,3,4,2,7,1,4,3,1,7,3,3;8 O- y5 n5 Z8 A$ p, I9 W; J; ^
5,2,3,5,2,2,1,2,3,1,2,3,4;
1 y4 D E9 G$ |2 U. P$ C# ^2 g: j 5,2,4,1,2,2,5,2,3,7,1,6,2;] " c/ ^7 G9 X( n! q8 T$ ]2 V1 w
data2 = [1,2,3,1,2,2,4,2,3,1,2,7,2;
" W0 w! ~( L; [5 |, Z9 y 1,2,3,6,2,2,1,4,3,1,5,3,1;3 l& a& T$ l6 ]; a8 n- o4 s
1,2,3,1,2,5,1,2,4,1,2,3,2;! L7 H/ k; i& d
1,2,7,1,2,2,1,2,5,1,2,4,1;
; ?! S8 P2 K7 F. B# e! t 5,2,3,3,5,2,1,2,3,1,2,3,6;
) M' K# b: o- ?! V+ P% w( r 1,2,3,1,2,2,1,6,5,1,2,6,4;
1 ]. E2 [ H' k 5,2,3,4,4,2,1,2,3,1,2,5,6;' I' c) b& N3 x v/ i7 v( ?7 T
1,2,6,1,2,2,1,2,3,1,4,3,2;& [4 L* _* z1 w+ _5 a# E/ v# H/ _
1,2,3,4,2,7,1,4,3,1,7,3,3;
, I* t M* C0 L# U; J8 v 5,2,3,5,2,2,1,2,3,1,2,3,4;
6 D+ t" P# I& M* R. P" A 4,2,5,1,2,2,6,2,3,7,1,6,4;] % initial guess of parameters
2 V4 I- f( B. z5 p9 G* }% 初始化参数* G, e V1 [/ V
prior1 = normalise(rand(Q,1));* C0 |1 t5 b. ~ t
transmat1 = mk_stochastic(rand(Q,Q));8 q) |0 A, X4 P2 a( I- s
obsmat1 = mk_stochastic(rand(Q,O)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2 x K% w( c6 W" S: I) F: p$ o- P% 添加部分2 n5 o$ B* V* x5 D; ^
prior3 = normalise(rand(Q2,1));
7 R3 N0 h/ W- v, J8 O$ K/ z8 m transmat3 = mk_stochastic(rand(Q2,Q2));
. Q1 [& Q# O) p7 H& z obsmat3 = mk_stochastic(rand(Q2,O2));7 a8 D8 R# U; E; F6 N
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % improve guess of parameters using EM
$ P. }7 {; v% ?* ]% 用data数据集训练参数矩阵形成新的HMM模型2 a5 v' J: \) D: V2 p
[LL, prior2, transmat2, obsmat2] = dhmm_em(data, prior1, transmat1, obsmat1, 'max_iter', size(data,1));: e% A( O) I& j5 V Q2 N
% 训练后那行观察值与HMM匹配度
3 E# i$ a' C6 c1 b. ^) y2 ]' fLL1 @6 O1 a$ ^6 ]
% 训练后的初始概率分布
' V, x3 w/ m6 d$ v& l8 k- I; vprior2, S2 \. |- d' {+ ~" _% G" A
% 训练后的状态转移概率矩阵
3 D- p( x# Y P2 N0 Y% Otransmat23 S7 ^/ z* ^& N& O
% 观察值概率矩阵
# v. D# g" b1 S! C/ } ?obsmat2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%- U" \! P) e0 M
% 添加部分; x$ F. Q4 i' A5 W. k1 T0 N
[LL2, prior4, transmat4, obsmat4] = dhmm_em(data2, prior3, transmat3, obsmat3, 'max_iter', size(data2,1));
! W6 U; k0 [# D& J" o( W) Q LL2
: t- z% H' f" A3 A7 B# m$ | prior42 d1 }+ W1 w% m0 ]" v. b8 x6 e# n
transmat42 k: ^1 d7 r2 W- k, l
obsmat4( T: a. P* _- ^" {. n
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % use model to compute log likelihood
& L; Z$ ]2 H4 h. o; R# T; e% data1=[1,2,3,1,2,2,1,2,3,1,2,3,1]1 B7 ^0 M5 F8 |$ H
data1 = [5,2,4,1,2,2,5,2,3,7,1,6,2]
9 X' Y2 B1 q6 Uloglik = dhmm_logprob(data1, prior2, transmat2, obsmat2), l. ?5 P& q$ L. N+ ^. }
% log lik is slightly different than LL(end), since it is computed after the final M step0 T, R1 z6 x# r! U' w
% loglik 代表着data和这个hmm(三参数为prior2, transmat2, obsmat2)的匹配值,越大说明越匹配,0为极大值。 % path为viterbi算法的结果,即最大概率path %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%, u: ]* C6 Z: [! h0 L# C5 x( ]8 |
% 添加部分+ K3 d" _$ T. O, r
loglik2 = dhmm_logprob(data1, prior4, transmat4, obsmat4), j0 h2 f5 d: |" W( J4 s. @
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
j" O# x6 h4 ~% z0 b# LB = multinomial_prob(data1,obsmat2);
% ^/ u6 k; d z; E0 b: ]; S3 X, dpath = viterbi_path(prior2, transmat2, B)
3 ~! b; \" O# B Csave('sa.mat');
) g3 c" S, e% r* O+ u3 Q
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
; E |5 W8 L8 |. e* ?! V% 添加部分
" y1 [1 P; D! p/ |2 e) i B2 = multinomial_prob(data1,obsmat4);0 d7 j5 P5 K: Q
path2 = viterbi_path(prior4, transmat4, B2)
! r" D( v! C/ r% G$ R save('sa2.mat');
9 P% c) U" i; X, M5 ~/ T- o0 z if loglik2 > loglik
$ E- C2 C* [4 `7 N A fuhe = 2
4 V$ b; }9 K( V% g8 A else
8 l0 h9 R" X: e: K, k( M fuhe = 1
1 F3 y2 v6 x7 w7 |9 R' _ end 8 c" {0 }6 s! m$ v
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ------ 运行结果 ------ data = 1 2 3 1 2 2 4 2 3 1 2 7 22 s) v3 [1 n6 I v& d
1 2 3 6 2 2 1 4 3 1 5 3 1
5 t- j$ e4 }" S( b9 R 1 2 3 1 2 5 1 2 4 1 2 3 2+ q5 ?, n) T/ T
1 2 7 1 2 2 1 2 5 1 2 4 18 L6 X( J& b8 ] N+ d3 z
5 2 3 3 5 2 1 2 3 1 2 3 6$ [ ?0 T6 Z" _
1 2 3 1 2 2 1 6 5 1 2 6 47 ~, e5 ] x8 u4 w6 y
5 2 3 4 4 2 1 2 3 1 2 5 6. V; {" q3 S" D* z- V
1 2 6 1 2 2 1 2 3 1 4 3 2
( {+ L, n J4 n0 v; _" j6 _ 1 2 3 4 2 7 1 4 3 1 7 3 3! ?% u0 Q& x+ N$ ?
5 2 3 5 2 2 1 2 3 1 2 3 4- Q9 y+ S& M1 m: |$ {
5 2 4 1 2 2 5 2 3 7 1 6 2 ( e2 n/ a# i5 l$ s- {" g4 u
data2 = 1 2 3 1 2 2 4 2 3 1 2 7 2* [& H3 S$ e8 [* w1 _. H" v1 O F
1 2 3 6 2 2 1 4 3 1 5 3 1
5 a, b5 L5 _. h2 y 1 2 3 1 2 5 1 2 4 1 2 3 23 t+ a9 |# \* {( V
1 2 7 1 2 2 1 2 5 1 2 4 1
0 b9 X m; T' s$ m* M Z 5 2 3 3 5 2 1 2 3 1 2 3 6' ?3 j& z! g0 h w5 {8 y- a
1 2 3 1 2 2 1 6 5 1 2 6 4% v+ O( @. B6 [5 B' x" k( D. [
5 2 3 4 4 2 1 2 3 1 2 5 6
: u, J j3 Z* n$ Q 1 2 6 1 2 2 1 2 3 1 4 3 2+ e' z6 a: }: D% p9 F5 F8 m5 R
1 2 3 4 2 7 1 4 3 1 7 3 32 V# _5 o+ E5 N" x
5 2 3 5 2 2 1 2 3 1 2 3 4
) Z3 I0 U" M- |5 x& j/ @ 4 2 5 1 2 2 6 2 3 7 1 6 4 iteration 1, loglik = -327.100465+ {8 ?0 L7 t. c) ^
iteration 2, loglik = -238.259812
% ]) G' Q! D- D' `, jiteration 3, loglik = -232.962948! g- M& K/ U! a' Z& G
iteration 4, loglik = -223.323891
$ _3 ?9 j: Q: g0 e+ l& piteration 5, loglik = -207.630875' D/ y1 t* B* g2 Q8 u
iteration 6, loglik = -191.012697! x# A; ~9 K4 d% r1 t
iteration 7, loglik = -178.611546
; g: ^$ Q" T4 o4 y( N- }iteration 8, loglik = -171.524132
: Q6 v3 i3 X6 h6 W9 r, ]* _2 _iteration 9, loglik = -168.626526
3 h) s1 x! _4 k' ~ d" O siteration 10, loglik = -167.387057
& X+ M- x: d V; D/ ]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
( D r/ M$ Z" N/ H4 I" d' n" U+ _+ tprior2 =
0.0000
* [ H: y8 y) |, h/ n& U 0.0000 j/ B( O5 X# T
1.0000) E* k* m' _3 Z$ D r
0.0000; ~" k# J; f" s! k1 |
0.0000 1 d0 ]! y% J) }# L# Q3 |; ~
transmat2 = 0.0138 0.0089 0.7680 0.1060 0.1033# P+ E1 |7 U9 U/ y' _1 F! R" f
0.7811 0.0000 0.0199 0.0067 0.1923
# n& c0 c' O" B% C 0.0000 0.9936 0.0000 0.0064 0.0000$ W$ Y2 _; ~; G6 x; E: _
0.1686 0.2604 0.2242 0.3398 0.0070
( r& N2 j/ L: } F9 W* N, X7 X 0.0053 0.0406 0.8350 0.1184 0.0007 3 n1 V( {' q- M) e* Z0 K! p! r
obsmat2 = 0.0000 0.2351 0.5738 0.0256 0.1118 0.0186 0.0351& N0 h4 M5 O, ]3 w- J
0.0000 0.8270 0.0000 0.0790 0.0256 0.0456 0.0228
/ d" r+ u' C$ Y 0.7514 0.0021 0.0011 0.0550 0.1472 0.0432 0.00002 a& }% I' J) M5 ^1 D U$ G) v' t
0.0014 0.4208 0.0447 0.4366 0.0023 0.0887 0.00558 r$ V0 S/ _% ~% t6 W) B
0.0000 0.0784 0.3223 0.2014 0.0116 0.1525 0.2338 iteration 1, loglik = -277.738670
6 E7 m$ }/ a2 t- S1 hiteration 2, loglik = -242.163247
2 N0 z5 f, b6 N. Uiteration 3, loglik = -238.321971% T# F$ J. i+ ^$ p7 r/ n& ?
iteration 4, loglik = -233.166746
( [# G& f) e. U6 F* U: I* piteration 5, loglik = -225.6822593 h) i/ d7 E6 @8 G, U5 r7 P
iteration 6, loglik = -214.5602964 i2 E4 S& j$ v* f
iteration 7, loglik = -201.182015
* z4 t& f# m$ l; E0 Eiteration 8, loglik = -189.427453) Y& w. N" j- ^
iteration 9, loglik = -179.1563523 ~! V$ @) {: T% k) H
iteration 10, loglik = -171.744096, [5 @3 ?" i+ E: t* A2 N
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 ( K5 p8 y) B. l, E$ m
prior4 = 0.0000) A2 [2 |, l+ E. D3 Q. Z. U4 N
0.99828 g& _+ m Y3 Y7 U9 U7 j8 [; D
0.0004
( S3 c( \& f3 ^8 @# N, {9 q4 H# S, ^ 0.0014
+ \: e% {0 d- w% c 0.0000
$ [9 F) w l3 mtransmat4 =
0.0873 0.5277 0.2799 0.1007 0.0045, S1 y) m7 w5 k$ `( D
0.0002 0.0000 0.0005 0.0000 0.9994* C* V; c( Y4 E9 s+ ]# N% p5 i' W9 j
0.0180 0.0000 0.0118 0.0011 0.96922 S3 O- s: @( Y0 R! Q! U A9 J
0.0436 0.0226 0.0810 0.0219 0.8310
' D9 y) K* V5 @: Q( m 0.9746 0.0056 0.0003 0.0195 0.0000
* o9 [$ W$ u/ h2 G6 qobsmat4 =
0.0000 0.2012 0.5080 0.0580 0.1093 0.0465 0.0770
+ x1 E+ S7 k$ E U 0.7939 0.0001 0.0000 0.0745 0.1277 0.0038 0.0000
, B; k) p$ y& @ 0.4120 0.1044 0.0049 0.1736 0.0032 0.3017 0.00015 h ^4 E) k& f$ R. A% F7 M
0.4527 0.0622 0.0637 0.2568 0.0549 0.0295 0.0802% ]1 h$ j+ }* P. e& l) i1 L5 e, W
0.0000 0.8172 0.0000 0.0943 0.0270 0.0389 0.0225
) L1 k o9 p1 \: B% I8 \data1 =
5 2 4 1 2 2 5 2 3 7 1 6 2 ! `5 k$ P+ Q( q7 V, N! v
loglik = -19.2351 6 f$ S6 z. A- N4 ^% h8 ^! R
loglik2 = -21.0715
4 n& a3 |5 ^' q7 U9 ipath =
3 2 5 3 2 1 3 2 1 5 3 2 1 8 M9 K4 W7 p2 U4 Q/ @* `2 L" Y
path2 = 2 5 1 2 5 1 2 5 1 1 2 5 1 " { `; k9 Z; V1 [ K' Y/ J" a" ^
fuhe = 1 |