% ①定义一个HMM并训练这个HMM。3 y; G+ u4 Z" D4 e+ B
% ②用一组观察值测试这个HMM,计算该组观察值域HMM的匹配度。5 D! W& u: d0 }0 L( x2 y, f
% 修改:旺齐齐, J5 T0 ^ a& ]0 t7 P; _# a
% 修改部分为:添加 HMM2 模型。测试一个观察序列更加符合哪个哪个HMM模型。
* E' D8 y* e" c1 Q. @9 r, p1 M%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % O:观察状态数9 @% |+ S" L. |9 O: |
O = 7;6 K9 l3 m% t B7 a. W$ d
O2 = 7;8 D, E' v) _3 f7 E6 K) J
% Q:HMM状态数8 S! d$ w. A2 S1 w
Q = 5;
1 z, V- _7 S$ t# F: W, x/ NQ2 = 5;
9 p' H4 y) u8 W8 B ?. V" ~%训练的数据集,每一行数据就是一组训练的观察值
; F3 W% |0 Z; X; f6 a% Vdata=[1,2,3,1,2,2,4,2,3,1,2,7,2;
7 Z/ f7 Z0 U8 J# c* G: Z 1,2,3,6,2,2,1,4,3,1,5,3,1;
% @9 w$ l3 H! L8 f% t 1,2,3,1,2,5,1,2,4,1,2,3,2; R# X( w) }# r
1,2,7,1,2,2,1,2,5,1,2,4,1;
0 z# a2 N: W; P- g 5,2,3,3,5,2,1,2,3,1,2,3,6;
; D4 c+ X! g6 M7 e$ V 1,2,3,1,2,2,1,6,5,1,2,6,4;5 f, Z3 Q' _$ ~% H: b+ M5 P
5,2,3,4,4,2,1,2,3,1,2,5,6;$ Q! f, O! ?, J; L- z- K9 G
1,2,6,1,2,2,1,2,3,1,4,3,2;
7 D% } F$ q/ K3 m/ U$ } 1,2,3,4,2,7,1,4,3,1,7,3,3;
. L1 M% h7 Y9 \0 q0 ?* J: E 5,2,3,5,2,2,1,2,3,1,2,3,4;8 J+ h5 k; E5 C1 C S
5,2,4,1,2,2,5,2,3,7,1,6,2;] 4 h9 t- _/ Q9 j h1 Y
data2 = [1,2,3,1,2,2,4,2,3,1,2,7,2;2 e7 |3 A! @0 W& M3 [
1,2,3,6,2,2,1,4,3,1,5,3,1;
2 a+ [& C. p9 ~: _) k& w5 T6 U4 _ 1,2,3,1,2,5,1,2,4,1,2,3,2;2 m# m3 y' a4 i6 h
1,2,7,1,2,2,1,2,5,1,2,4,1;
* A9 g, l, J% X- [3 K 5,2,3,3,5,2,1,2,3,1,2,3,6;( ~& R, u& Y2 B
1,2,3,1,2,2,1,6,5,1,2,6,4;
. g% H- }" [( E/ t6 [ 5,2,3,4,4,2,1,2,3,1,2,5,6;
7 J3 @9 A) L" B1 m 1,2,6,1,2,2,1,2,3,1,4,3,2;
! B# |+ b6 I7 A6 r 1,2,3,4,2,7,1,4,3,1,7,3,3;8 |0 I4 e. x5 F( I) ^
5,2,3,5,2,2,1,2,3,1,2,3,4;( z5 q* Y# j4 U* R
4,2,5,1,2,2,6,2,3,7,1,6,4;] % initial guess of parameters+ K2 ]+ b" b: {
% 初始化参数; U/ K' X8 r1 T& {: y: Y5 X0 N: }- d9 g
prior1 = normalise(rand(Q,1));
; i* S# T9 a3 \, ptransmat1 = mk_stochastic(rand(Q,Q));
8 @) q" C* h, ?( s2 Dobsmat1 = mk_stochastic(rand(Q,O)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
# r6 f& g) _) V0 K" r- z% 添加部分2 X! j9 M+ P5 w0 {' a
prior3 = normalise(rand(Q2,1));
0 i% u5 ] K" v+ ?5 c6 d0 c; T* B transmat3 = mk_stochastic(rand(Q2,Q2));
, W" t, M# ^6 Y( N$ w- E+ h obsmat3 = mk_stochastic(rand(Q2,O2));
6 ~5 L5 f; i- j4 M( |%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % improve guess of parameters using EM
( A4 Y% k/ F5 j$ A' S% 用data数据集训练参数矩阵形成新的HMM模型$ d4 j* j. w6 r
[LL, prior2, transmat2, obsmat2] = dhmm_em(data, prior1, transmat1, obsmat1, 'max_iter', size(data,1));( B1 k& y R3 f) J. ^$ t
% 训练后那行观察值与HMM匹配度' O2 u9 q, S% B, s9 Z5 b' c3 D
LL: H! g: y5 p r$ i/ c
% 训练后的初始概率分布* P% {( m: p% x' C+ L( N. p
prior2
; {) D/ e# k4 R A% 训练后的状态转移概率矩阵
- m/ g5 [# `8 a. H3 n& Dtransmat2
6 o- j4 N v/ X) I% 观察值概率矩阵4 E$ k2 m* G2 U1 W6 f/ W4 ?2 [! l
obsmat2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ~8 A9 K$ |# H8 o0 O$ \; f( q
% 添加部分
0 k5 m" t2 y7 M9 K* K/ q, c [LL2, prior4, transmat4, obsmat4] = dhmm_em(data2, prior3, transmat3, obsmat3, 'max_iter', size(data2,1));
, ~0 c) z( |& L" B6 k& W$ j LL2# @0 O8 C! V' i1 [( f
prior4
0 N& f/ A; H9 D8 q& |: J$ l& F/ y7 s transmat4
1 Y# [9 ]+ C# M: u* |- G obsmat4
: k. U- P: K4 h* \%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % use model to compute log likelihood+ J& \* i( `( N$ |8 u: F% J
% data1=[1,2,3,1,2,2,1,2,3,1,2,3,1]) _3 y. V/ Y% m3 Z, O* a. ~* O
data1 = [5,2,4,1,2,2,5,2,3,7,1,6,2]& P3 _. A6 }- \8 p
loglik = dhmm_logprob(data1, prior2, transmat2, obsmat2), @# ]1 h8 ]/ D1 C6 K$ ~3 T! t
% log lik is slightly different than LL(end), since it is computed after the final M step+ x, h) o' i! c4 ?
% loglik 代表着data和这个hmm(三参数为prior2, transmat2, obsmat2)的匹配值,越大说明越匹配,0为极大值。 % path为viterbi算法的结果,即最大概率path %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%- V: ] D1 b7 V4 P+ i$ F
% 添加部分& p) }( w& W; F' v" W$ k
loglik2 = dhmm_logprob(data1, prior4, transmat4, obsmat4)- E- j2 P2 ?" k9 ~ J& u
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
: z7 X0 k" h( G( i# z, Q$ [B = multinomial_prob(data1,obsmat2);5 @: w' c6 w/ R: Q, O
path = viterbi_path(prior2, transmat2, B) u, i% P D" h7 ?4 m( N6 t8 B
save('sa.mat');
2 \; M& M+ l( R) A: X; _
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2 C. s0 O4 \: x+ e/ x! p6 T% 添加部分
, X/ g7 k) z I ^! S* }0 n B2 = multinomial_prob(data1,obsmat4);$ g" W+ O" Y. d' {. T
path2 = viterbi_path(prior4, transmat4, B2)
. K8 e, g& k- V2 o/ \ save('sa2.mat');
& l, d! |( I3 s# N g if loglik2 > loglik
3 R9 _9 A" T) b fuhe = 24 u# B: ~, ~5 s" L. j
else9 u5 d" C! I7 E1 \% j% A: I
fuhe = 1
! c& {8 ?6 s6 i. L- ?+ r1 g1 ` end
3 N" E% m0 g: B+ B1 c%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ------ 运行结果 ------ data = 1 2 3 1 2 2 4 2 3 1 2 7 2
* Y" _! k+ U! u. A5 G 1 2 3 6 2 2 1 4 3 1 5 3 1) T4 V& F4 \) S
1 2 3 1 2 5 1 2 4 1 2 3 2! M* s* H7 K; D# d7 [- T/ ]! A; V
1 2 7 1 2 2 1 2 5 1 2 4 18 R7 F8 D0 r6 U* H: G" _
5 2 3 3 5 2 1 2 3 1 2 3 6
* g6 q! v' @8 a( b 1 2 3 1 2 2 1 6 5 1 2 6 45 ~* {7 N% ?' ]: F
5 2 3 4 4 2 1 2 3 1 2 5 69 W, I9 k8 c8 _( m
1 2 6 1 2 2 1 2 3 1 4 3 2- E+ q+ {1 E% P z% E5 D/ |
1 2 3 4 2 7 1 4 3 1 7 3 3, }$ `3 n$ I" J, t
5 2 3 5 2 2 1 2 3 1 2 3 4
7 p& V6 f- {* v. q& ? 5 2 4 1 2 2 5 2 3 7 1 6 2 $ T) u3 I% d% @* ]: V1 \- a
data2 = 1 2 3 1 2 2 4 2 3 1 2 7 2% S2 X2 f& ?/ _" K- |5 ?- b
1 2 3 6 2 2 1 4 3 1 5 3 10 g- t* r, `, B+ e0 q, s) b: [
1 2 3 1 2 5 1 2 4 1 2 3 2
9 S$ l' z$ k+ T9 q$ t 1 2 7 1 2 2 1 2 5 1 2 4 17 W& G& { s" F' Y( c
5 2 3 3 5 2 1 2 3 1 2 3 6
7 w9 Y" O: o; l 1 2 3 1 2 2 1 6 5 1 2 6 4
# n0 P7 d: H, _2 Y# H 5 2 3 4 4 2 1 2 3 1 2 5 64 p: q/ v0 O! R; M
1 2 6 1 2 2 1 2 3 1 4 3 24 b8 h) N5 r! c/ m" i8 X/ b
1 2 3 4 2 7 1 4 3 1 7 3 3
- ~8 u0 F# V% D 5 2 3 5 2 2 1 2 3 1 2 3 4
! C& ]0 C( P9 F A# _ 4 2 5 1 2 2 6 2 3 7 1 6 4 iteration 1, loglik = -327.100465
7 @, [2 g+ q2 [* giteration 2, loglik = -238.259812
/ o$ Z& Y1 l; M8 O8 W# _$ kiteration 3, loglik = -232.962948
3 u2 T) [1 q4 M& ]0 P5 ^9 Biteration 4, loglik = -223.323891' y9 v4 J# G" k6 |7 c# X* [
iteration 5, loglik = -207.6308756 r9 g! x7 Z+ Q: Q2 G& g
iteration 6, loglik = -191.012697
$ h0 |9 ]! Y( H( \iteration 7, loglik = -178.6115468 x G0 p; e% h& m* g
iteration 8, loglik = -171.5241326 K2 L+ S: V% W0 O+ d! g& c* G% k
iteration 9, loglik = -168.626526
$ e" ~- |3 v2 e, ~4 x( g4 {1 fiteration 10, loglik = -167.387057
~9 ]& I# p4 Giteration 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
9 z2 J9 w. W' y; D- R' iprior2 =
0.0000
: g, y5 d4 B2 j- R; D 0.00008 E7 k: h! e. t+ \
1.0000
4 O! H* N0 ]* {3 S# j) Z 0.0000
( l2 |$ ]1 @# ~5 X5 D5 b& W 0.0000
, r( v3 f/ m: F0 C$ Htransmat2 =
0.0138 0.0089 0.7680 0.1060 0.1033
& y& V1 O/ v4 R3 f4 u! L& R 0.7811 0.0000 0.0199 0.0067 0.1923
5 `- l- I- s1 [4 N7 ~, Y- K9 v% J 0.0000 0.9936 0.0000 0.0064 0.0000
1 w+ q7 Z1 t$ \! N 0.1686 0.2604 0.2242 0.3398 0.0070; n. u7 k# m& o+ A+ |# p
0.0053 0.0406 0.8350 0.1184 0.0007 7 V6 |( p' b% P1 k4 x* b& r; \
obsmat2 = 0.0000 0.2351 0.5738 0.0256 0.1118 0.0186 0.0351
' A w( [7 d$ D+ U g 0.0000 0.8270 0.0000 0.0790 0.0256 0.0456 0.0228
3 U' e0 G+ l" O6 B J% w3 [8 H6 D( h' w 0.7514 0.0021 0.0011 0.0550 0.1472 0.0432 0.0000
- n6 Q7 c! L% D3 H5 z 0.0014 0.4208 0.0447 0.4366 0.0023 0.0887 0.0055 |. z% h8 e& S) S' Q8 a% \
0.0000 0.0784 0.3223 0.2014 0.0116 0.1525 0.2338 iteration 1, loglik = -277.738670" I' F6 f& q* u. f& M6 g j! F. k
iteration 2, loglik = -242.163247
! H3 J! b& u' B( Xiteration 3, loglik = -238.3219713 H' M& ~9 Z5 h& {( W( `
iteration 4, loglik = -233.166746
( r" |0 j' L' ? eiteration 5, loglik = -225.682259; |( b3 q9 G2 S. v/ h% g
iteration 6, loglik = -214.560296
* z& o, D7 A$ B6 @iteration 7, loglik = -201.182015. C; g9 x$ G2 c& V3 f
iteration 8, loglik = -189.427453
( d* x$ d' T% U# e+ Miteration 9, loglik = -179.156352
0 Z7 ^# g) y- J9 viteration 10, loglik = -171.7440964 j3 m+ n. [% S4 {" M8 I
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 7 r4 ^+ P% @. t8 ^& {, _1 H. A: }
prior4 = 0.0000
/ p6 p0 J" ^* A8 \$ q 0.9982; ]6 O% |8 I( b* G1 M
0.0004
7 ]4 N0 ]# E$ b$ V8 X7 J 0.0014
7 c6 Y, r S* L/ F 0.0000 ! A1 j9 {' k8 ~" k
transmat4 = 0.0873 0.5277 0.2799 0.1007 0.00451 h. [, Z7 E+ i0 D9 F3 N, \
0.0002 0.0000 0.0005 0.0000 0.9994
/ e7 K% q& O4 H( ^% G3 M! E' ]8 r6 H 0.0180 0.0000 0.0118 0.0011 0.9692- f Y8 P# j' q0 K/ S7 L
0.0436 0.0226 0.0810 0.0219 0.8310
9 q6 j# a' g0 i( x4 Q7 f8 O 0.9746 0.0056 0.0003 0.0195 0.0000 : h* Z a; B) R
obsmat4 = 0.0000 0.2012 0.5080 0.0580 0.1093 0.0465 0.0770
" k4 w0 I+ i: `# W- f 0.7939 0.0001 0.0000 0.0745 0.1277 0.0038 0.0000+ c- I5 [1 @; A
0.4120 0.1044 0.0049 0.1736 0.0032 0.3017 0.0001# e3 ]* C- u' g, T; p% g
0.4527 0.0622 0.0637 0.2568 0.0549 0.0295 0.08025 u6 Q2 t) n' @ J4 L, T
0.0000 0.8172 0.0000 0.0943 0.0270 0.0389 0.0225
5 N2 c/ O8 H: w7 g/ Tdata1 =
5 2 4 1 2 2 5 2 3 7 1 6 2 & X7 k7 {4 q9 w8 {$ m+ k9 t/ R
loglik = -19.2351
( e9 S& j* Q7 W4 I- E, A gloglik2 =
-21.0715 . F- F+ ^3 H/ N( W- d% k: O" J4 ^
path = 3 2 5 3 2 1 3 2 1 5 3 2 1
0 L n" A8 u; ^1 P: C. A2 {1 rpath2 =
2 5 1 2 5 1 2 5 1 1 2 5 1 - W1 k, r- }; w L. ~% e
fuhe = 1 |