% ①定义一个HMM并训练这个HMM。
U; @' w& }) I6 z4 a- M& `% ②用一组观察值测试这个HMM,计算该组观察值域HMM的匹配度。
% v' n. g0 v" r3 L) g% 修改:旺齐齐8 C6 B( l4 _8 Z
% 修改部分为:添加 HMM2 模型。测试一个观察序列更加符合哪个哪个HMM模型。 T A! V* K" ?& k% E
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % O:观察状态数3 ?1 Y6 p" v" O6 e3 b
O = 7;' Y- M7 t4 \5 M- W1 z
O2 = 7;, b% Y4 Z9 p! V& ~' Q5 o8 n
% Q:HMM状态数
% D. t* X; S& V2 X4 U( Z# X0 F8 l/ ]- VQ = 5;1 z T- W0 J+ e8 r
Q2 = 5;- ]: \. x7 F+ X
%训练的数据集,每一行数据就是一组训练的观察值# g [( }8 _$ ^; d* S2 @; K
data=[1,2,3,1,2,2,4,2,3,1,2,7,2;/ r7 Y ^' {# d
1,2,3,6,2,2,1,4,3,1,5,3,1;) L' U" U, Y# y0 m/ Z: E
1,2,3,1,2,5,1,2,4,1,2,3,2;
$ q2 h# \& O! ] 1,2,7,1,2,2,1,2,5,1,2,4,1;. `6 Q0 D0 p/ ~% `" |9 z
5,2,3,3,5,2,1,2,3,1,2,3,6;- t. O9 W5 @' h. n, y
1,2,3,1,2,2,1,6,5,1,2,6,4;
7 e l/ p. i4 V9 O- L8 r: \ 5,2,3,4,4,2,1,2,3,1,2,5,6;
' u% {- v! |0 {# e( c8 _" C9 G( b 1,2,6,1,2,2,1,2,3,1,4,3,2;
/ L2 K' P- K% d N' ?- @ 1,2,3,4,2,7,1,4,3,1,7,3,3;0 W( W: g" n& b% L# h
5,2,3,5,2,2,1,2,3,1,2,3,4;' t/ u: i) |1 O
5,2,4,1,2,2,5,2,3,7,1,6,2;]
* U8 h! c& c& c" ~ data2 = [1,2,3,1,2,2,4,2,3,1,2,7,2;
+ c; s, ~5 Q* W) O" i 1,2,3,6,2,2,1,4,3,1,5,3,1;- p7 ^. R2 W6 k! W* w
1,2,3,1,2,5,1,2,4,1,2,3,2;
7 M' K/ B. d+ n8 B 1,2,7,1,2,2,1,2,5,1,2,4,1;) j. f6 b* X6 L% G
5,2,3,3,5,2,1,2,3,1,2,3,6;
( c- v d# a% M/ N% F; ` 1,2,3,1,2,2,1,6,5,1,2,6,4;
4 S& g( J3 f3 _1 X- k9 \5 f' ^% ` 5,2,3,4,4,2,1,2,3,1,2,5,6;# n! C+ ^- p5 Y( `) w" @
1,2,6,1,2,2,1,2,3,1,4,3,2;
" E7 F) M$ `9 n! p$ B 1,2,3,4,2,7,1,4,3,1,7,3,3;
" M( X! u' _1 e 5,2,3,5,2,2,1,2,3,1,2,3,4;- p D0 |3 t, {4 U, q t8 G" K& \
4,2,5,1,2,2,6,2,3,7,1,6,4;]
% initial guess of parameters$ }0 m+ l2 V+ O5 }' {& N. A
% 初始化参数. C S5 q. D: P, F; a" A$ }
prior1 = normalise(rand(Q,1));: b {( V5 ^4 ~3 X" y# T& t1 H
transmat1 = mk_stochastic(rand(Q,Q));
9 R. B# Q( h) a5 P& {obsmat1 = mk_stochastic(rand(Q,O)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 G: y Z/ t6 P* y( b
% 添加部分2 M* e6 H7 V" d/ q! {1 `
prior3 = normalise(rand(Q2,1));/ m8 F/ x* r/ D) {. d1 J
transmat3 = mk_stochastic(rand(Q2,Q2));
$ m' x0 u" B2 }: N obsmat3 = mk_stochastic(rand(Q2,O2));. h" a4 _# D1 f$ q: r/ s; O
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % improve guess of parameters using EM
1 A5 N# [' V% Y8 F% 用data数据集训练参数矩阵形成新的HMM模型
" [+ v% i3 Y) W' ?" f* T[LL, prior2, transmat2, obsmat2] = dhmm_em(data, prior1, transmat1, obsmat1, 'max_iter', size(data,1));% w! q% ~& b$ U2 b. X# t
% 训练后那行观察值与HMM匹配度9 U" J4 K! a6 e. a, f1 y
LL) Z" p# O$ H2 B" X) N1 Z
% 训练后的初始概率分布
. m5 O1 [5 @" A4 iprior2: p- N. ]9 x- B: Y, U
% 训练后的状态转移概率矩阵
& g9 ?# C; j) B- l# c( Ptransmat2
6 }) Q2 L! q7 p7 M8 W# S) d8 Q% 观察值概率矩阵
- ?3 r0 q/ A9 k3 d$ Sobsmat2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%: w: A& Z% t/ s! Q" S3 G3 w
% 添加部分2 _4 q0 d" C, i6 w, g9 v2 o
[LL2, prior4, transmat4, obsmat4] = dhmm_em(data2, prior3, transmat3, obsmat3, 'max_iter', size(data2,1));
0 f. Z) l4 T: N6 G/ y, d$ a% k9 @# B LL2
C5 l! k s" w prior4$ Z1 C8 @/ L, d: R
transmat4
0 ?6 J D- {0 p$ V" y) p7 l0 G: b obsmat4
: N: j, ^7 G% f% ~1 Z) a7 a _3 u%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % use model to compute log likelihood. p! ]% _( U. O$ R
% data1=[1,2,3,1,2,2,1,2,3,1,2,3,1]7 A: v3 P+ r5 Z
data1 = [5,2,4,1,2,2,5,2,3,7,1,6,2]
`, L) p6 a9 M* p( a8 \loglik = dhmm_logprob(data1, prior2, transmat2, obsmat2)! `8 ]. w0 b+ u9 D; J
% log lik is slightly different than LL(end), since it is computed after the final M step
( Y, l1 l: M1 L7 |' S/ s% loglik 代表着data和这个hmm(三参数为prior2, transmat2, obsmat2)的匹配值,越大说明越匹配,0为极大值。 % path为viterbi算法的结果,即最大概率path %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9 n/ f/ C1 G- l9 J J. B) s: l7 C% 添加部分* ]$ w9 [, g% [
loglik2 = dhmm_logprob(data1, prior4, transmat4, obsmat4)2 F) U, A' e2 d# B# D
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% & y q# m( |7 p% l7 c/ k
B = multinomial_prob(data1,obsmat2);! C& b5 ^0 C( r( y
path = viterbi_path(prior2, transmat2, B)
$ C7 a* U3 W: k9 `' asave('sa.mat'); 8 q# e8 m3 A$ ^ o' }. @* ^/ Q
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 U5 \& l7 M/ G
% 添加部分# Q' b2 O4 t6 r8 P
B2 = multinomial_prob(data1,obsmat4);
2 s) F3 t4 I8 ?+ y. J- @ path2 = viterbi_path(prior4, transmat4, B2)
: M# d* b: P' S$ Q save('sa2.mat');, T' T5 I: A0 v3 t& v
if loglik2 > loglik ) R+ y; L9 c* p( ]
fuhe = 26 U8 E4 A A+ `$ f6 u. M% N$ j
else0 \8 F' }" Z4 Y; `
fuhe = 1* a% _3 n8 o. N d2 F
end
4 |2 u3 O. r* s- N; P%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ------ 运行结果 ------ data = 1 2 3 1 2 2 4 2 3 1 2 7 2" M7 x* Y$ w6 V/ h
1 2 3 6 2 2 1 4 3 1 5 3 1/ ]) g7 u8 V1 E) z8 h1 T2 j
1 2 3 1 2 5 1 2 4 1 2 3 2$ ^4 L4 c* _. E7 L E& C( m6 e/ q
1 2 7 1 2 2 1 2 5 1 2 4 1
1 |" g m0 e) U$ l9 G* i; Q 5 2 3 3 5 2 1 2 3 1 2 3 6
" B* N( b+ u! z# `4 e7 S 1 2 3 1 2 2 1 6 5 1 2 6 4
& _! y5 [4 N2 ^9 \6 w 5 2 3 4 4 2 1 2 3 1 2 5 67 z7 q4 v9 J# B
1 2 6 1 2 2 1 2 3 1 4 3 29 q& o1 M( U/ k( X+ }5 Z1 V
1 2 3 4 2 7 1 4 3 1 7 3 3
, a) J4 M7 i( L# G- N 5 2 3 5 2 2 1 2 3 1 2 3 4
( u8 w' `$ l- [" T2 { 5 2 4 1 2 2 5 2 3 7 1 6 2
6 Y# j: H, r2 `+ g. V- Z4 idata2 =
1 2 3 1 2 2 4 2 3 1 2 7 23 W' }' F. ~6 L9 X0 G5 w6 i
1 2 3 6 2 2 1 4 3 1 5 3 1
5 {5 Q7 } b! F9 ]$ m" T2 v N 1 2 3 1 2 5 1 2 4 1 2 3 23 b# D, E( G# p7 R
1 2 7 1 2 2 1 2 5 1 2 4 1" {* i; d+ \2 d( ]% [
5 2 3 3 5 2 1 2 3 1 2 3 6: k* E U8 Z) c# A1 o- p( \
1 2 3 1 2 2 1 6 5 1 2 6 4( ]7 H9 V0 b* P3 G8 F
5 2 3 4 4 2 1 2 3 1 2 5 6
( J0 J; j, J& k9 w2 h9 @6 ?) i 1 2 6 1 2 2 1 2 3 1 4 3 2/ ?1 s/ j5 `$ d( T
1 2 3 4 2 7 1 4 3 1 7 3 3 {" @' X- Z% f; H2 J7 y0 z3 K( A, d
5 2 3 5 2 2 1 2 3 1 2 3 4! F. K8 Z! x3 s3 S" M$ L( Y+ E
4 2 5 1 2 2 6 2 3 7 1 6 4 iteration 1, loglik = -327.100465
# `$ T- ]1 M, w& G, K" [0 M1 [iteration 2, loglik = -238.259812
9 v: i+ B7 E9 ?2 s( j* X. uiteration 3, loglik = -232.962948
" t; G1 e" c3 ~; r5 Citeration 4, loglik = -223.323891( u4 |+ _* L. r ~4 t9 t" c' J
iteration 5, loglik = -207.6308750 u# u8 i- G7 q- i; s+ K
iteration 6, loglik = -191.012697) T' w9 Z( P* c% c; d4 J! P
iteration 7, loglik = -178.611546
* }* d# P6 B+ t7 m& s2 p# G: `, viteration 8, loglik = -171.5241322 ? Q. I; \. A/ O8 c# O. P
iteration 9, loglik = -168.6265264 P. I6 `1 v2 ^/ N
iteration 10, loglik = -167.387057, A$ b5 W6 P5 W3 n. N' }2 ]# T
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 ) s' S) C& p3 d! Y$ G8 I9 E
prior2 = 0.0000
K% i6 f7 e* j& Q 0.0000
# v. T/ y- m3 D, G- y& d; b 1.0000& a) v) G5 b E+ f- A
0.0000/ E+ o2 p9 A) L+ I/ |
0.0000 5 [4 I# g4 [; O5 _+ u z$ Z
transmat2 = 0.0138 0.0089 0.7680 0.1060 0.10338 o; U* j8 R9 {$ ?, C5 w8 t
0.7811 0.0000 0.0199 0.0067 0.1923, T/ Q7 i0 }* J2 [/ u, [
0.0000 0.9936 0.0000 0.0064 0.0000* h. e) }( T# y: X9 ` T R% t
0.1686 0.2604 0.2242 0.3398 0.0070
5 y0 S/ Q% F8 V9 N 0.0053 0.0406 0.8350 0.1184 0.0007
$ L% j9 t, F j2 M: q* F6 o6 `, L' [. {obsmat2 =
0.0000 0.2351 0.5738 0.0256 0.1118 0.0186 0.0351
9 `+ |% s2 W: e' n* r" i 0.0000 0.8270 0.0000 0.0790 0.0256 0.0456 0.0228
. q0 e% ^( f9 `; P; u b; X$ A D 0.7514 0.0021 0.0011 0.0550 0.1472 0.0432 0.0000
. i# p/ i0 F8 L( ^; D 0.0014 0.4208 0.0447 0.4366 0.0023 0.0887 0.0055
# J4 S7 O& b0 B6 v7 b 0.0000 0.0784 0.3223 0.2014 0.0116 0.1525 0.2338 iteration 1, loglik = -277.738670
' J3 F6 q( |2 j; I! ziteration 2, loglik = -242.163247
* r9 |+ M( s5 D( T, Oiteration 3, loglik = -238.3219719 q& x1 c Q/ ]% p( w
iteration 4, loglik = -233.166746
4 u/ k+ g$ k Z% H' [5 \7 i$ f! hiteration 5, loglik = -225.682259
/ L% X; t, O( H% Kiteration 6, loglik = -214.5602967 \6 P* ^7 |! |$ h, w& h
iteration 7, loglik = -201.182015
" K/ O; [; t3 H) {iteration 8, loglik = -189.427453
/ [" Q* t6 a# w1 Q8 K$ C; T$ Z: Qiteration 9, loglik = -179.156352. T$ {0 B+ ^8 I; v
iteration 10, loglik = -171.744096
. R* S3 J4 ^- J! T5 n9 siteration 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
6 ]+ I, ]# P/ r: @* Q( F; Dprior4 =
0.0000
! B: {- u& V- F/ T/ }5 G 0.9982
7 n8 w( {3 g' _5 L/ ^( c& } 0.0004. s2 `5 [4 m3 Z4 ]+ i
0.00141 ^$ \. C2 z; P# o; S W
0.0000
" G3 L* t6 c4 j/ e: stransmat4 =
0.0873 0.5277 0.2799 0.1007 0.0045
. j8 Q0 I' U8 `* `+ y1 O" V/ \5 o 0.0002 0.0000 0.0005 0.0000 0.9994* ]& ~% @% t/ m5 v! R
0.0180 0.0000 0.0118 0.0011 0.96922 U2 T, B: h; y0 o/ m
0.0436 0.0226 0.0810 0.0219 0.8310
+ U9 G" [, R3 T0 e! z$ i" l 0.9746 0.0056 0.0003 0.0195 0.0000
8 R3 Y: t$ d8 X4 i) nobsmat4 =
0.0000 0.2012 0.5080 0.0580 0.1093 0.0465 0.0770
( ]) D/ ]5 Y) C1 M 0.7939 0.0001 0.0000 0.0745 0.1277 0.0038 0.0000
- R4 g4 M5 a+ P 0.4120 0.1044 0.0049 0.1736 0.0032 0.3017 0.0001
& p: I+ R! f. ~; `0 K5 r& u% s 0.4527 0.0622 0.0637 0.2568 0.0549 0.0295 0.0802
1 y; ?( e" d; o* x/ W @( B9 | 0.0000 0.8172 0.0000 0.0943 0.0270 0.0389 0.0225 - |* M7 @' a& H* l( Q( O
data1 = 5 2 4 1 2 2 5 2 3 7 1 6 2
: o' |. L( C, M# I- bloglik =
-19.2351 % }8 `* Z, D" ~' t) Q
loglik2 = -21.0715
: m% G+ O, X% i" d+ Lpath =
3 2 5 3 2 1 3 2 1 5 3 2 1 & {! O- H S8 D5 P0 z \8 d8 F
path2 = 2 5 1 2 5 1 2 5 1 1 2 5 1
, S% J( c4 ]8 t6 ?0 Ufuhe =
1 |