% ①定义一个HMM并训练这个HMM。
' d. A# ^$ U A6 A6 x+ E+ Z* {/ n& R% ②用一组观察值测试这个HMM,计算该组观察值域HMM的匹配度。2 m- Y, c- D) @: n
% 修改:旺齐齐
- s; K$ \6 g3 N9 v! P# _ [7 {% 修改部分为:添加 HMM2 模型。测试一个观察序列更加符合哪个哪个HMM模型。
7 m! W6 }( V1 W6 ]7 P%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % O:观察状态数7 ~6 F+ e) L3 L. {$ M
O = 7;
, J7 X1 y9 A8 v% H% |0 l$ O1 KO2 = 7;- S7 m1 ]/ X- S: _ Y) A) ^
% Q:HMM状态数7 O, s$ ^+ W3 H3 _' |$ P
Q = 5;
/ p4 {. D: D+ T3 A" g. f( gQ2 = 5;. w) c( A9 _/ R4 L) H0 b, L, @, @3 w
%训练的数据集,每一行数据就是一组训练的观察值2 G& J7 ~! S! S2 b; w7 F
data=[1,2,3,1,2,2,4,2,3,1,2,7,2;
$ p+ m# p/ T- l5 ^ 1,2,3,6,2,2,1,4,3,1,5,3,1;
% w& p0 n: B) G! E5 p% }# k6 `( i/ O 1,2,3,1,2,5,1,2,4,1,2,3,2;( ^" ^* v/ _" b
1,2,7,1,2,2,1,2,5,1,2,4,1;- ]8 k V: O9 m% N
5,2,3,3,5,2,1,2,3,1,2,3,6;
i& A$ y, J% \; u 1,2,3,1,2,2,1,6,5,1,2,6,4;
" M& u! p$ n' N- i- E; O 5,2,3,4,4,2,1,2,3,1,2,5,6;
" W7 k- j* x' a. v7 q! h 1,2,6,1,2,2,1,2,3,1,4,3,2;
}1 i' \! P4 `# M# Y 1,2,3,4,2,7,1,4,3,1,7,3,3;, u l5 x: [. \6 g1 O7 L. {! V
5,2,3,5,2,2,1,2,3,1,2,3,4;
( z: ^8 z$ i7 R2 T8 H+ }: _6 ? 5,2,4,1,2,2,5,2,3,7,1,6,2;]
+ G. U- S# h l$ @ data2 = [1,2,3,1,2,2,4,2,3,1,2,7,2;
, O4 O( O5 v" i% z5 ], k& h" N 1,2,3,6,2,2,1,4,3,1,5,3,1;
' `; Y. z5 R" s, a2 A 1,2,3,1,2,5,1,2,4,1,2,3,2;7 X- p. y* Y3 |( l
1,2,7,1,2,2,1,2,5,1,2,4,1;
! [: K) t/ e) S* _ 5,2,3,3,5,2,1,2,3,1,2,3,6;6 L3 B0 F& y9 K. l, a! ^8 s* H. Q
1,2,3,1,2,2,1,6,5,1,2,6,4;7 E6 ]1 {' K- M. _
5,2,3,4,4,2,1,2,3,1,2,5,6;
3 S/ Z# b) L8 X; k 1,2,6,1,2,2,1,2,3,1,4,3,2;
3 h0 S7 ~7 a& i: b9 k6 ~ 1,2,3,4,2,7,1,4,3,1,7,3,3;
$ h1 _4 a+ W" @& U5 C) z 5,2,3,5,2,2,1,2,3,1,2,3,4;
; B1 v: H: x3 E 4,2,5,1,2,2,6,2,3,7,1,6,4;]
% initial guess of parameters
7 q$ p0 P+ _7 j) {) J$ B% 初始化参数
% A4 m8 z5 F5 i+ O( o) @* Q# Jprior1 = normalise(rand(Q,1));
, p/ I6 ?4 m$ Y: w: ]transmat1 = mk_stochastic(rand(Q,Q));
( v3 a# @4 ?# i4 tobsmat1 = mk_stochastic(rand(Q,O)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
' Y% ]2 @2 j, j2 t( _. a* G4 v% 添加部分7 c. I4 m, @: r. l" c2 c* @
prior3 = normalise(rand(Q2,1));8 f% _2 [+ l _( g7 @. u6 @
transmat3 = mk_stochastic(rand(Q2,Q2));/ W/ ], M* c0 `% ]* h" y* L
obsmat3 = mk_stochastic(rand(Q2,O2));/ o9 |. L: [ M
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % improve guess of parameters using EM$ }( l, f" H3 e7 V* a1 I2 G
% 用data数据集训练参数矩阵形成新的HMM模型; j, U! G3 Q/ P" f5 P! E
[LL, prior2, transmat2, obsmat2] = dhmm_em(data, prior1, transmat1, obsmat1, 'max_iter', size(data,1));- p# s J+ `: l) ]7 k& g9 e* n+ }
% 训练后那行观察值与HMM匹配度
0 `7 I+ w+ L* n: Q* J% a" {LL$ c. Y! U X$ m/ C2 N
% 训练后的初始概率分布
e; A5 |7 ~, a1 C' d0 {: Pprior2
/ m! B4 e. w+ I% 训练后的状态转移概率矩阵
9 V% f7 g: |! T! W }7 j7 n! Ctransmat2
% E# e5 H7 A, k% T2 o% 观察值概率矩阵
1 k4 }( q- c5 e' Q' iobsmat2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4 l! ^2 ^ d; b! S% 添加部分' [3 t# k/ C! r5 L: K) S8 C& o
[LL2, prior4, transmat4, obsmat4] = dhmm_em(data2, prior3, transmat3, obsmat3, 'max_iter', size(data2,1));: ?9 q3 O# R2 ^) C2 h
LL2
( y N* x5 Z2 ]8 Z( B* r p3 R: t prior4
, q% |! e! m3 D' ]1 t! m* T2 t transmat4
2 j1 G) R' p: l6 v2 [/ M2 b7 t obsmat4! h# a1 ?& |7 ~: E# H
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % use model to compute log likelihood z. `: X2 z- _# N1 N+ o4 i
% data1=[1,2,3,1,2,2,1,2,3,1,2,3,1]2 @4 B7 o( x1 n' {* ~: x
data1 = [5,2,4,1,2,2,5,2,3,7,1,6,2]- I5 k2 g+ M, T! \/ z3 L
loglik = dhmm_logprob(data1, prior2, transmat2, obsmat2)
8 q) s; W7 |, \) N* C% log lik is slightly different than LL(end), since it is computed after the final M step1 @7 l7 z* Y, K5 P9 E# P# f
% loglik 代表着data和这个hmm(三参数为prior2, transmat2, obsmat2)的匹配值,越大说明越匹配,0为极大值。 % path为viterbi算法的结果,即最大概率path %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%: v8 _' v, b/ H: n+ }6 V
% 添加部分
" q8 ]3 k: O% K% x- E4 Yloglik2 = dhmm_logprob(data1, prior4, transmat4, obsmat4). Q: ^' f, c) W5 g( m
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
# a/ a( i: t, d5 V kB = multinomial_prob(data1,obsmat2);
! m4 H6 N! l: {: P$ z. Spath = viterbi_path(prior2, transmat2, B)
- h: }9 \ X+ C! D3 O1 N6 ~save('sa.mat');
& [, l% n: u8 e M%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%& C& T% l H* ]& r$ {0 U$ f! S/ A0 ` |
% 添加部分
. d. ^: s, w) g B2 = multinomial_prob(data1,obsmat4);3 |; H& i0 c* `9 i6 h
path2 = viterbi_path(prior4, transmat4, B2)
! `- |' I* {' y9 v save('sa2.mat');
# `4 I1 C2 S2 x5 f7 O4 m* y if loglik2 > loglik ( l2 C, k/ S# g- e/ h2 g: U
fuhe = 2
. y; F, B8 _$ e1 h3 r1 J5 X8 r else5 O+ k K1 M, i' X! \3 m5 o5 R' R
fuhe = 13 \" w1 B8 Q0 @# a9 a! \. B
end / n4 b2 R) ^. t, D+ B5 ~
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
------ 运行结果 ------ data = 1 2 3 1 2 2 4 2 3 1 2 7 2. c- P" ^% @0 t
1 2 3 6 2 2 1 4 3 1 5 3 13 ?- @+ j: h9 T- \3 _0 j `
1 2 3 1 2 5 1 2 4 1 2 3 2, M# m% b! N2 P6 }& B! w
1 2 7 1 2 2 1 2 5 1 2 4 1
) o5 G0 E6 q( m1 \7 d) J, _ 5 2 3 3 5 2 1 2 3 1 2 3 6
* ~6 c3 W( W! U r7 J7 N 1 2 3 1 2 2 1 6 5 1 2 6 4
9 Y4 W5 N. Q. c a9 B M8 a' I 5 2 3 4 4 2 1 2 3 1 2 5 66 k- B9 H. _( T5 x% A
1 2 6 1 2 2 1 2 3 1 4 3 2
+ N* {' y" G6 i9 v8 h# @ 1 2 3 4 2 7 1 4 3 1 7 3 3# f6 w( V( }: [8 i0 D
5 2 3 5 2 2 1 2 3 1 2 3 4
_# S4 t& g0 E/ r6 k, |- C/ w 5 2 4 1 2 2 5 2 3 7 1 6 2
4 u1 t D* e5 Z1 K" Tdata2 =
1 2 3 1 2 2 4 2 3 1 2 7 2' k* a# x! S/ D$ c& D# F
1 2 3 6 2 2 1 4 3 1 5 3 1
9 L$ F) x6 o/ x/ ]) b 1 2 3 1 2 5 1 2 4 1 2 3 2$ Q7 A6 s0 u J2 b4 \
1 2 7 1 2 2 1 2 5 1 2 4 1
) z6 C* z' n3 ^. y* q 5 2 3 3 5 2 1 2 3 1 2 3 6& Q8 h7 k% _& N" A( [ }7 \0 A
1 2 3 1 2 2 1 6 5 1 2 6 4, ]' a: U9 K. k" f% r
5 2 3 4 4 2 1 2 3 1 2 5 61 ^9 s9 d/ ~: \0 E/ l
1 2 6 1 2 2 1 2 3 1 4 3 2
6 @* T. J) Q9 s# b' y 1 2 3 4 2 7 1 4 3 1 7 3 3
. R) W8 s$ ?+ W Y- _4 G9 F, e 5 2 3 5 2 2 1 2 3 1 2 3 4* ]4 i7 b" X* y, @2 ^
4 2 5 1 2 2 6 2 3 7 1 6 4 iteration 1, loglik = -327.100465
5 Z" O j, j0 |1 x7 kiteration 2, loglik = -238.259812# P: e! A0 k# L" r6 B6 p# U
iteration 3, loglik = -232.962948
/ }' S1 ~* \) i% Z7 ^8 m! m' ^& j5 witeration 4, loglik = -223.323891* h! M+ x) H f; f
iteration 5, loglik = -207.6308758 v% r2 f/ n8 g3 \# N/ B8 `
iteration 6, loglik = -191.012697+ Y6 W2 q6 }: P1 x. H% \3 h
iteration 7, loglik = -178.6115465 `* w5 R- e9 k( `9 @
iteration 8, loglik = -171.5241328 p `$ Z2 a% d( j+ L+ ?
iteration 9, loglik = -168.626526
8 c0 K* T9 k+ g# S6 o- }8 a; q% M# g, Witeration 10, loglik = -167.3870577 Z$ K; X: @7 g) ~4 l
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 1 T& ~9 q1 _ h3 f) N. {
prior2 = 0.0000
1 U7 y2 H/ D% @; w. y" ~ 0.00004 r$ B% }2 [7 Z0 Q6 g: P+ ~
1.0000
7 _: J& O8 t" g8 |5 b9 r 0.0000
% u/ _! \: q. x 0.0000 , t+ h2 y3 ^( H. R
transmat2 = 0.0138 0.0089 0.7680 0.1060 0.10331 n( e: d+ W* E% Q) q
0.7811 0.0000 0.0199 0.0067 0.1923
9 v3 V( f6 B8 q4 n 0.0000 0.9936 0.0000 0.0064 0.0000) A _" Q: z- `' G# j) R6 m1 D* `
0.1686 0.2604 0.2242 0.3398 0.0070; T5 D- u4 E, @* z
0.0053 0.0406 0.8350 0.1184 0.0007
' i3 [: g. D3 f. f) H: {obsmat2 =
0.0000 0.2351 0.5738 0.0256 0.1118 0.0186 0.0351- G2 G' j4 ?4 s7 i0 g) G* c
0.0000 0.8270 0.0000 0.0790 0.0256 0.0456 0.02288 h5 Q( u$ E' }- l
0.7514 0.0021 0.0011 0.0550 0.1472 0.0432 0.0000
3 K2 I+ y; F' p, ], b 0.0014 0.4208 0.0447 0.4366 0.0023 0.0887 0.0055
4 O( \0 ]1 Z( y! U 0.0000 0.0784 0.3223 0.2014 0.0116 0.1525 0.2338 iteration 1, loglik = -277.738670 v9 n# p3 t& u" ~
iteration 2, loglik = -242.163247
( T. Q w, p7 w4 U) miteration 3, loglik = -238.321971
) E- K7 u, K3 C% w# I; Ziteration 4, loglik = -233.166746
% s; J n7 b/ M: ?# g. ?3 `iteration 5, loglik = -225.682259
1 p8 p6 t6 V/ c% M! {, oiteration 6, loglik = -214.560296
7 m5 ~/ n/ X1 D% Jiteration 7, loglik = -201.1820157 f$ A& r( f% w7 Z
iteration 8, loglik = -189.427453( t' _/ _% h/ Y% P' U3 r
iteration 9, loglik = -179.156352 E; U0 n0 H5 y' {! _. `: c
iteration 10, loglik = -171.744096
+ e" M5 d+ @/ b" e3 n+ i' w: literation 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 0 \$ ?6 p$ Z3 h* Q
prior4 = 0.0000
. h8 W3 q1 ]: w' G/ H0 K E/ B 0.9982
# H" Q O( ^- o& J, X7 ]- o. C0 B 0.0004
* b" a- Z- J! O ]4 l& M! [ 0.0014
! T1 G. H( B+ v9 }2 f, @ 0.0000
) N4 G5 b$ M8 o2 x! o5 Otransmat4 =
0.0873 0.5277 0.2799 0.1007 0.00452 a( o, Y1 K# {+ k
0.0002 0.0000 0.0005 0.0000 0.9994
, \8 T3 U1 p }/ m 0.0180 0.0000 0.0118 0.0011 0.9692
" T3 }& W/ f5 t7 X5 ]. I( E 0.0436 0.0226 0.0810 0.0219 0.8310
) t$ o1 e6 G$ o8 G7 U8 R 0.9746 0.0056 0.0003 0.0195 0.0000 4 q$ U0 l- C- @! C5 F {. X+ M
obsmat4 = 0.0000 0.2012 0.5080 0.0580 0.1093 0.0465 0.07705 q1 L) Y( u# ]0 ~0 @ t
0.7939 0.0001 0.0000 0.0745 0.1277 0.0038 0.0000) }1 l" P/ e" P7 J9 {
0.4120 0.1044 0.0049 0.1736 0.0032 0.3017 0.0001
/ p3 C: A6 G+ K 0.4527 0.0622 0.0637 0.2568 0.0549 0.0295 0.08022 h/ z$ A& U6 U' L6 ?+ a: v
0.0000 0.8172 0.0000 0.0943 0.0270 0.0389 0.0225
! ?! V, A& X, h, C }data1 =
5 2 4 1 2 2 5 2 3 7 1 6 2
" }( r: N+ W" B# iloglik =
-19.2351 * M3 w+ l C: D: x% T+ L
loglik2 = -21.0715
\1 ]/ P0 a' W- Upath =
3 2 5 3 2 1 3 2 1 5 3 2 1 + W( q0 ^. c" H3 Y
path2 = 2 5 1 2 5 1 2 5 1 1 2 5 1 & N3 M, G% { l2 p
fuhe = 1 |