% ①定义一个HMM并训练这个HMM。
7 X: l5 B# ^4 s/ n& [9 j8 q% ②用一组观察值测试这个HMM,计算该组观察值域HMM的匹配度。3 j* h* \/ B( U
% 修改:旺齐齐
" i3 b( @/ {/ `' n1 j% 修改部分为:添加 HMM2 模型。测试一个观察序列更加符合哪个哪个HMM模型。/ S" `& \/ g" {2 Y) x
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % O:观察状态数* R( `) R) k$ B. z" L8 a& S
O = 7;' e% U1 S3 V# f4 ?0 E
O2 = 7;
2 ?% [6 J* \/ B& y0 H% Q:HMM状态数
& U5 ~1 E0 T! V, S# u. C: ]Q = 5;
# p2 H& C9 d. j# }Q2 = 5;
% b; n% m- S P%训练的数据集,每一行数据就是一组训练的观察值
4 T. H# m( n3 ~; T8 h; T* ~0 Mdata=[1,2,3,1,2,2,4,2,3,1,2,7,2;
) R+ W# C2 D* p( Q# [/ \ 1,2,3,6,2,2,1,4,3,1,5,3,1;
% o/ a. f6 a, V 1,2,3,1,2,5,1,2,4,1,2,3,2;5 p6 `; ?, i- s! q" F6 F8 u! Q
1,2,7,1,2,2,1,2,5,1,2,4,1;
# ~0 p7 @9 U- }/ Y O# B 5,2,3,3,5,2,1,2,3,1,2,3,6;
) `, g; y% M V 1,2,3,1,2,2,1,6,5,1,2,6,4;3 e8 Q: G0 M6 M0 V) m5 A2 K
5,2,3,4,4,2,1,2,3,1,2,5,6;; X9 b7 M; Z1 }$ Q8 g7 B1 p, k
1,2,6,1,2,2,1,2,3,1,4,3,2;
3 m* m* V! ~: j/ T2 I 1,2,3,4,2,7,1,4,3,1,7,3,3;
8 C# O0 ?: b' L6 |( \/ d! D0 } 5,2,3,5,2,2,1,2,3,1,2,3,4;
. k! Y; l. o) l# @9 J- V8 ]1 s 5,2,4,1,2,2,5,2,3,7,1,6,2;] ' f$ K9 S8 ^+ e" V% h- A
data2 = [1,2,3,1,2,2,4,2,3,1,2,7,2;2 {3 q0 u. E6 i" f
1,2,3,6,2,2,1,4,3,1,5,3,1;4 d* C' o/ Z: I% Z, D/ ]/ w
1,2,3,1,2,5,1,2,4,1,2,3,2;$ E3 X% R3 |5 U: U2 Y( ? c
1,2,7,1,2,2,1,2,5,1,2,4,1;5 r1 j& K& v" J! n
5,2,3,3,5,2,1,2,3,1,2,3,6;
* t4 }% A; Y: X; ^: k$ ? 1,2,3,1,2,2,1,6,5,1,2,6,4;
7 H f9 G, _3 Z# ] 5,2,3,4,4,2,1,2,3,1,2,5,6;
, d8 `* P" t2 V6 O+ o% a 1,2,6,1,2,2,1,2,3,1,4,3,2;
9 @, w2 x: k. X7 x! o 1,2,3,4,2,7,1,4,3,1,7,3,3;
5 y) \1 O5 J2 {5 ]2 d 5,2,3,5,2,2,1,2,3,1,2,3,4;
6 }1 v8 v1 h4 ~4 O8 p 4,2,5,1,2,2,6,2,3,7,1,6,4;] % initial guess of parameters
% X- C" |7 R# g4 C6 S% 初始化参数8 r3 u# n2 c3 M, D4 a. [
prior1 = normalise(rand(Q,1));
4 J/ W( [$ o. c6 P9 _* otransmat1 = mk_stochastic(rand(Q,Q)); i2 ]' {& V8 m6 x
obsmat1 = mk_stochastic(rand(Q,O)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6 r8 R! @8 g: d1 w+ U$ e5 O y' P% 添加部分
8 R4 `5 p/ b8 t0 e2 Q7 ^9 j$ m0 I prior3 = normalise(rand(Q2,1));6 f& v+ t* | X. j W9 f+ s& g
transmat3 = mk_stochastic(rand(Q2,Q2));) E7 }$ H; y/ k
obsmat3 = mk_stochastic(rand(Q2,O2));4 I) W" J. N; k
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % improve guess of parameters using EM0 F. p: r; n, M% }
% 用data数据集训练参数矩阵形成新的HMM模型+ p, R2 \* M4 v
[LL, prior2, transmat2, obsmat2] = dhmm_em(data, prior1, transmat1, obsmat1, 'max_iter', size(data,1));" f% Q$ X1 D+ a
% 训练后那行观察值与HMM匹配度" b; E6 k" F+ N0 d) x! M
LL; S$ Q. j( S$ B% }
% 训练后的初始概率分布3 U: \% B2 J4 `" W. D' p2 \# Z) ^
prior2
% u+ \% P" {6 X* z4 T+ b% 训练后的状态转移概率矩阵# d1 f6 W! x! K R2 R; ^4 v' R
transmat2
/ _: z, I) q4 o" o" M4 ~% 观察值概率矩阵
|# W+ j2 V5 p& bobsmat2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 |' G$ [/ H! V1 U
% 添加部分
" Z( s6 b- v; ]- A. I0 x( i [LL2, prior4, transmat4, obsmat4] = dhmm_em(data2, prior3, transmat3, obsmat3, 'max_iter', size(data2,1));/ M, h0 n$ Z; y6 o: ^ Z
LL2. T, y+ Q, Y) q' i0 z% D) z8 g- [/ D
prior4
; e- U# T! L& Q4 D2 v/ J1 n8 O3 t0 R transmat4% Q4 W; h4 }0 G6 S- U9 s
obsmat4# u/ H( S5 C' O# i ]% q
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % use model to compute log likelihood: x3 Z8 l' s: f* W. e. |1 y
% data1=[1,2,3,1,2,2,1,2,3,1,2,3,1]
' e7 t- O0 T1 Cdata1 = [5,2,4,1,2,2,5,2,3,7,1,6,2]2 E4 M3 c& t6 z
loglik = dhmm_logprob(data1, prior2, transmat2, obsmat2)* {" f: a. m# R1 _; e' D
% log lik is slightly different than LL(end), since it is computed after the final M step2 S$ N& Q2 G1 `: S$ P
% loglik 代表着data和这个hmm(三参数为prior2, transmat2, obsmat2)的匹配值,越大说明越匹配,0为极大值。 % path为viterbi算法的结果,即最大概率path %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 [5 A# D% Y- ~# ?" \4 S
% 添加部分
N/ _, Q( A( H8 v( Z7 Ologlik2 = dhmm_logprob(data1, prior4, transmat4, obsmat4)6 V( S) k( U0 ?" S
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4 z5 e3 G. j6 JB = multinomial_prob(data1,obsmat2);
& A' l8 c+ }' K6 ]; xpath = viterbi_path(prior2, transmat2, B)
P; u3 j7 r( ?- y& l, e/ Dsave('sa.mat');
# `# g9 W$ |4 d4 [9 i$ z%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
; L- J" {' L0 H8 c L. _9 w# G% 添加部分( m6 Z+ N; }; M# b1 Z* f1 O8 G
B2 = multinomial_prob(data1,obsmat4);5 A! V# Z& _6 V/ c
path2 = viterbi_path(prior4, transmat4, B2)
8 q: L& E: o7 [. R) }8 b save('sa2.mat');+ Z- V. |) o* F
if loglik2 > loglik
0 l+ m _: k' X& M fuhe = 24 J6 I) G' c0 ]7 h' U! w
else4 `( V( I1 @5 N. b& _
fuhe = 1
* t- v* R: c( j& j$ n9 ~ end
5 ^' x/ c! A( o) T1 M5 T+ Y%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
------ 运行结果 ------ data = 1 2 3 1 2 2 4 2 3 1 2 7 20 v: ~1 \, J% D) @# t0 {2 ^9 V
1 2 3 6 2 2 1 4 3 1 5 3 1
* |# M: E, M8 t* ]# S 1 2 3 1 2 5 1 2 4 1 2 3 2% K! O9 S" C4 r" W {5 |
1 2 7 1 2 2 1 2 5 1 2 4 1. S5 \6 O/ y/ F
5 2 3 3 5 2 1 2 3 1 2 3 6" U2 ], X& O3 N3 L: @2 Q
1 2 3 1 2 2 1 6 5 1 2 6 4; r) X, B) |( N" V0 m; m. x( }
5 2 3 4 4 2 1 2 3 1 2 5 6
5 F- [; J$ ~0 I3 V( v R0 U8 e# d( p 1 2 6 1 2 2 1 2 3 1 4 3 2
1 R& w1 ~$ s1 K/ O+ A" \! q! d2 V 1 2 3 4 2 7 1 4 3 1 7 3 3
5 J* T& G1 ^# }0 s7 g1 x 5 2 3 5 2 2 1 2 3 1 2 3 4 E: W3 i/ E+ n! ?' B
5 2 4 1 2 2 5 2 3 7 1 6 2
9 z8 x, y- M' q5 H$ i, U8 b2 ~4 \data2 =
1 2 3 1 2 2 4 2 3 1 2 7 2
( B# E( h2 z% E0 { 1 2 3 6 2 2 1 4 3 1 5 3 1: a$ k' E3 e& `2 c5 [3 j
1 2 3 1 2 5 1 2 4 1 2 3 2; }) F4 x1 k( r8 H0 G, ^: C( g, X
1 2 7 1 2 2 1 2 5 1 2 4 1
# m9 u' B6 D/ t 5 2 3 3 5 2 1 2 3 1 2 3 66 b2 Q' U0 {3 P+ j9 t; n/ ]
1 2 3 1 2 2 1 6 5 1 2 6 4
. Z! Q% x. d6 b 5 2 3 4 4 2 1 2 3 1 2 5 6
# M& ?; y% ~9 o X8 T 1 2 6 1 2 2 1 2 3 1 4 3 2
( S2 ~" y: Y& f6 s 1 2 3 4 2 7 1 4 3 1 7 3 3: ]: W! T8 `# m0 m" l* @ A1 a
5 2 3 5 2 2 1 2 3 1 2 3 4% a3 }2 t# M6 K: P# w1 i+ p
4 2 5 1 2 2 6 2 3 7 1 6 4 iteration 1, loglik = -327.100465/ K) u% Z, ^7 Y& v: d: l
iteration 2, loglik = -238.259812
$ y4 V2 y* J8 f, K7 B& hiteration 3, loglik = -232.962948
) \3 c- T% L& d1 {) Witeration 4, loglik = -223.323891
6 n* A7 ^6 P( C; Qiteration 5, loglik = -207.630875
3 B7 h% C/ ~% R, ?7 D$ Q( E* giteration 6, loglik = -191.012697/ J& _& z- T* t4 _* A# o# A" d
iteration 7, loglik = -178.611546
8 `5 q% U0 @1 Z7 Kiteration 8, loglik = -171.524132
K! m2 i4 |+ S, w. H2 Diteration 9, loglik = -168.6265264 F3 `1 v. {$ b1 e6 J2 A! n
iteration 10, loglik = -167.3870578 W5 B3 ]$ T" a4 D$ j
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
$ `% P9 L0 i J! Qprior2 =
0.00003 |/ x2 N; ^. |6 n* X1 G1 t% u% X
0.0000
" W3 V& l g2 B' y8 w6 ~ 1.0000! W+ L6 [+ s/ c+ t {8 ]
0.0000
, F, }& J4 e8 u5 A 0.0000
1 T# A. R. s" }6 Otransmat2 =
0.0138 0.0089 0.7680 0.1060 0.1033- q8 v' ^0 C) g& {9 Z+ e2 T
0.7811 0.0000 0.0199 0.0067 0.19230 ]5 n2 r8 b# `/ d. y$ N
0.0000 0.9936 0.0000 0.0064 0.0000* T& u3 c5 [4 j2 o( u: @! I
0.1686 0.2604 0.2242 0.3398 0.0070
. H6 A: V6 i6 P- P6 h1 Y& t 0.0053 0.0406 0.8350 0.1184 0.0007 @4 m) e! V6 i, D/ U
obsmat2 = 0.0000 0.2351 0.5738 0.0256 0.1118 0.0186 0.0351
# j3 T% s8 r, O: P% W/ i 0.0000 0.8270 0.0000 0.0790 0.0256 0.0456 0.0228
# M# i3 s9 n9 H& M% K; u, T 0.7514 0.0021 0.0011 0.0550 0.1472 0.0432 0.0000
$ V- J q$ s6 Q3 J" P( K 0.0014 0.4208 0.0447 0.4366 0.0023 0.0887 0.0055# I0 j3 @/ J* G6 x( W% a! @
0.0000 0.0784 0.3223 0.2014 0.0116 0.1525 0.2338 iteration 1, loglik = -277.738670# a1 K) ]0 y4 o- q _ y- E, L
iteration 2, loglik = -242.163247% B/ h; l' o. k+ y b3 f
iteration 3, loglik = -238.321971/ D) i$ D3 A1 u9 D2 l7 T% p
iteration 4, loglik = -233.1667462 ~1 i9 o% n; y" C
iteration 5, loglik = -225.682259# H* \+ G" _3 Z/ L
iteration 6, loglik = -214.5602969 D; a% H$ P. Q3 m; s* |' s
iteration 7, loglik = -201.1820159 N3 v. N- h$ S1 `9 A
iteration 8, loglik = -189.4274532 B- j, ^$ ~, I( c
iteration 9, loglik = -179.156352
- `' K' C, e5 G5 q9 w2 Z) kiteration 10, loglik = -171.744096
# J P- n' C* \! Hiteration 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
$ Y/ Q! l0 |0 W5 ?* g7 Aprior4 =
0.0000: q0 |: i4 D3 c) o/ p( i5 k: A. \
0.99825 K& h T! P b1 k+ b: {1 }
0.00041 N% h Q* S2 w( [6 u
0.0014/ r/ U! ]" O9 V4 W9 X8 v+ w5 u
0.0000 + b4 x: @' Z6 h0 G
transmat4 = 0.0873 0.5277 0.2799 0.1007 0.0045
& v. F Y$ R$ M 0.0002 0.0000 0.0005 0.0000 0.9994
6 e5 ?& J. _1 P 0.0180 0.0000 0.0118 0.0011 0.9692& z$ j- z! @9 T; O. s! V q6 K
0.0436 0.0226 0.0810 0.0219 0.8310, Y/ y# ~8 y: F6 H. Y0 k
0.9746 0.0056 0.0003 0.0195 0.0000
# `' A+ [, D0 ]' Aobsmat4 =
0.0000 0.2012 0.5080 0.0580 0.1093 0.0465 0.0770- {* v7 E( J$ J
0.7939 0.0001 0.0000 0.0745 0.1277 0.0038 0.0000, C. U. @7 C1 ~ P) i
0.4120 0.1044 0.0049 0.1736 0.0032 0.3017 0.0001
, _4 J- @7 J2 K- E! E. C; O/ o' s- ] 0.4527 0.0622 0.0637 0.2568 0.0549 0.0295 0.08020 L4 e! \4 x# Q6 }& ]* w
0.0000 0.8172 0.0000 0.0943 0.0270 0.0389 0.0225 4 a5 ?. T' P8 g( r
data1 = 5 2 4 1 2 2 5 2 3 7 1 6 2 8 ~# w6 L; |: }
loglik = -19.2351
- H& n3 Z3 t F5 g# B# c5 F: M9 Wloglik2 =
-21.0715 2 r- S' S! k9 A2 | X
path = 3 2 5 3 2 1 3 2 1 5 3 2 1 " j% B/ C+ M, {& h
path2 = 2 5 1 2 5 1 2 5 1 1 2 5 1 $ W$ l. L2 L! `2 ^# {
fuhe = 1 |