% ①定义一个HMM并训练这个HMM。( P' S& @5 O. ~/ X3 F
% ②用一组观察值测试这个HMM,计算该组观察值域HMM的匹配度。6 O$ O: o# N# N; J! G
% 修改:旺齐齐3 c& }$ V* J4 T$ h+ W- _
% 修改部分为:添加 HMM2 模型。测试一个观察序列更加符合哪个哪个HMM模型。/ i' X/ J$ R( t2 o0 L) Y+ q4 c
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % O:观察状态数' r+ h P4 R5 L4 o7 ]5 P
O = 7;
; i2 K% H |+ KO2 = 7;
; E# b6 t& t# s% Q:HMM状态数
; d5 e, i; A: X! B, GQ = 5;+ z' f. d2 m( V, J( ]' T+ a
Q2 = 5;6 e1 a6 D+ q* P- E
%训练的数据集,每一行数据就是一组训练的观察值
2 Y' x+ c/ p" ddata=[1,2,3,1,2,2,4,2,3,1,2,7,2;
9 Q0 X) V0 l* u, l- Z. G4 { 1,2,3,6,2,2,1,4,3,1,5,3,1;
' S5 W( s4 o/ t% L* b2 h( H 1,2,3,1,2,5,1,2,4,1,2,3,2;
7 O1 X# x8 Z6 {9 Z. z$ n: m 1,2,7,1,2,2,1,2,5,1,2,4,1;
& U, m$ H9 V* G! S$ Y; [2 O 5,2,3,3,5,2,1,2,3,1,2,3,6;8 [2 b) t2 x! O, M8 A _7 _
1,2,3,1,2,2,1,6,5,1,2,6,4;: A, e( M5 j. ^* T2 s+ l
5,2,3,4,4,2,1,2,3,1,2,5,6;6 s3 w* Q5 |: q7 p. S$ D
1,2,6,1,2,2,1,2,3,1,4,3,2;; W) S' c9 C9 I7 N% {
1,2,3,4,2,7,1,4,3,1,7,3,3;# ^$ @! e V# b+ t) O
5,2,3,5,2,2,1,2,3,1,2,3,4;
4 w2 Z) v& A( e# d9 e- ?/ B m0 \ 5,2,4,1,2,2,5,2,3,7,1,6,2;]
7 M# [ ]0 Z0 ^5 V( [* V+ V data2 = [1,2,3,1,2,2,4,2,3,1,2,7,2;+ d- o% z* {+ ~" r0 b
1,2,3,6,2,2,1,4,3,1,5,3,1;5 a% l% M4 }1 I4 ?3 M
1,2,3,1,2,5,1,2,4,1,2,3,2;! N5 C: k$ W6 Y. W" f) _3 F. K$ P7 O
1,2,7,1,2,2,1,2,5,1,2,4,1;
. L5 t9 |- F# Y! P: w* ` 5,2,3,3,5,2,1,2,3,1,2,3,6;$ v" F# K- Z$ H+ R/ X7 a
1,2,3,1,2,2,1,6,5,1,2,6,4;
1 \. ?9 x0 j( y: b% b* G2 G2 D3 [# u 5,2,3,4,4,2,1,2,3,1,2,5,6;
x, X6 ~( \$ j" ]! ] 1,2,6,1,2,2,1,2,3,1,4,3,2;
) K/ I8 ^1 P& W0 l 1,2,3,4,2,7,1,4,3,1,7,3,3;
, Z( {/ E1 H4 _6 W- l) V% T 5,2,3,5,2,2,1,2,3,1,2,3,4;" x4 r# S0 e h0 L
4,2,5,1,2,2,6,2,3,7,1,6,4;]
% initial guess of parameters
3 Q) G; i; m% F9 e/ N% b0 C0 N7 x% 初始化参数
% S+ S" D) A9 [3 U4 I! Dprior1 = normalise(rand(Q,1));
6 J- X" d4 J8 q# e% i, htransmat1 = mk_stochastic(rand(Q,Q));
5 ?' e0 ^- u9 t5 x* sobsmat1 = mk_stochastic(rand(Q,O)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7 p+ l" X, k1 a/ |+ p% 添加部分. q, X: V7 \: O2 S6 }9 \; |
prior3 = normalise(rand(Q2,1));; j r5 q9 k' J- q$ x. j, ~
transmat3 = mk_stochastic(rand(Q2,Q2));
" e- s5 k% p' L5 @$ R8 X1 Q obsmat3 = mk_stochastic(rand(Q2,O2));
- P L* n2 P8 [/ \%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % improve guess of parameters using EM. D" U( T+ S7 D( ?3 r
% 用data数据集训练参数矩阵形成新的HMM模型
4 d/ i7 A% o# V% Z% ^[LL, prior2, transmat2, obsmat2] = dhmm_em(data, prior1, transmat1, obsmat1, 'max_iter', size(data,1));
4 D: x2 ]( B3 Q# ?9 U% 训练后那行观察值与HMM匹配度
# ]& M% c4 S ~9 W2 XLL
2 Y4 i5 i/ F& z: H& X2 C% 训练后的初始概率分布 U; g( J! o4 ]; b4 L' y x! }& x! U, ?
prior2 c: v& @6 c6 k8 {) S$ R" w
% 训练后的状态转移概率矩阵! j4 |2 P! Z0 J- q+ T3 a+ h. ]% f- b
transmat2" ~. M6 M" o* y N: Z3 G
% 观察值概率矩阵. d+ I! A# n5 H. m% u4 G6 I$ ^
obsmat2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%$ S" e3 j% a/ G ], f- x
% 添加部分
( @3 U4 r y8 L: I, _' [- J [LL2, prior4, transmat4, obsmat4] = dhmm_em(data2, prior3, transmat3, obsmat3, 'max_iter', size(data2,1));( W* b! l! V7 p0 q8 A+ a7 ?( }+ _3 J
LL2
8 I8 v0 [. p. Z prior4 P+ C( x- p8 H% C% V4 F
transmat4
3 Q4 f5 z! I' v6 d% _0 m obsmat4
; o( U- m( H3 c3 f- f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % use model to compute log likelihood
5 N5 L) U% x( U% data1=[1,2,3,1,2,2,1,2,3,1,2,3,1]4 n7 O* t* z5 Z6 P
data1 = [5,2,4,1,2,2,5,2,3,7,1,6,2]# _) w5 ?; G7 L% F2 x
loglik = dhmm_logprob(data1, prior2, transmat2, obsmat2)
6 E1 b+ K5 x* e5 D% log lik is slightly different than LL(end), since it is computed after the final M step; R( \* p. E( l. F5 u
% loglik 代表着data和这个hmm(三参数为prior2, transmat2, obsmat2)的匹配值,越大说明越匹配,0为极大值。 % path为viterbi算法的结果,即最大概率path %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%; j4 u6 q) ?7 L" ? P
% 添加部分) _$ J. P- p# r5 ^
loglik2 = dhmm_logprob(data1, prior4, transmat4, obsmat4)* i" H3 F4 j6 V
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7 s; U! ?' _) o' [. mB = multinomial_prob(data1,obsmat2);% s: b4 y# M4 P& g: v
path = viterbi_path(prior2, transmat2, B)
8 y0 t9 k; v3 v& x; }: Usave('sa.mat');
% s. _+ d# e* D0 X1 ?
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 `$ c( Q: D3 x& E
% 添加部分
]1 z7 f/ E5 {1 t, X8 ] B2 = multinomial_prob(data1,obsmat4);! v$ v5 N. D- S$ P+ L; @+ ^# c/ M
path2 = viterbi_path(prior4, transmat4, B2)
: p8 Y( T: z& ^: n% z save('sa2.mat');2 c* n/ Q7 D; q) n; G
if loglik2 > loglik 0 N& V y9 Y' i; U {
fuhe = 29 ?( U* P8 V# I7 i
else
( Z5 `. u. c" B7 c! c! ~ fuhe = 1! i2 A9 i4 |$ }( j7 K; N
end
! M( t. E7 b# k8 _0 Q/ l G" n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ------ 运行结果 ------ data = 1 2 3 1 2 2 4 2 3 1 2 7 2+ D, {6 g( Q$ g& ^1 V1 S
1 2 3 6 2 2 1 4 3 1 5 3 1$ t- h5 i1 U; B4 f
1 2 3 1 2 5 1 2 4 1 2 3 28 }7 s' h$ @9 R1 S8 E% i
1 2 7 1 2 2 1 2 5 1 2 4 1" Q1 y' F; @- B4 {) I! t* _
5 2 3 3 5 2 1 2 3 1 2 3 6
5 a% i8 T0 x4 R& m0 ]# S1 h( l 1 2 3 1 2 2 1 6 5 1 2 6 49 N; [4 F8 ~4 t7 O: _- ]
5 2 3 4 4 2 1 2 3 1 2 5 6
! C6 I0 g6 A% u6 Z } 1 2 6 1 2 2 1 2 3 1 4 3 2* `5 I B2 K w3 @
1 2 3 4 2 7 1 4 3 1 7 3 34 n; n& r% B* C
5 2 3 5 2 2 1 2 3 1 2 3 4% y) H3 k7 R6 M0 u* X
5 2 4 1 2 2 5 2 3 7 1 6 2 t/ z0 w% Z0 t- a5 E1 \
data2 = 1 2 3 1 2 2 4 2 3 1 2 7 2
5 ^4 F9 O; }! u 1 2 3 6 2 2 1 4 3 1 5 3 1
& p% T6 y% j( `' t# K( I 1 2 3 1 2 5 1 2 4 1 2 3 2
8 U: |, F0 M. M+ Z7 V/ X5 }* F 1 2 7 1 2 2 1 2 5 1 2 4 1! F1 h: p1 r! n2 _: X, q
5 2 3 3 5 2 1 2 3 1 2 3 6
1 r/ ]* x2 q5 P% G. D; {. V9 f% @ 1 2 3 1 2 2 1 6 5 1 2 6 4
' I3 l+ x$ k2 \/ a4 H6 U/ t 5 2 3 4 4 2 1 2 3 1 2 5 6
1 b P- Z3 W+ |. K: }( a 1 2 6 1 2 2 1 2 3 1 4 3 2
$ V# O6 V: {; }+ Z 1 2 3 4 2 7 1 4 3 1 7 3 3
0 B; l9 D) [ v 5 2 3 5 2 2 1 2 3 1 2 3 4( a: T: d% K7 U/ I
4 2 5 1 2 2 6 2 3 7 1 6 4 iteration 1, loglik = -327.100465
* Q @ d2 T; c/ e& xiteration 2, loglik = -238.2598122 K3 A f9 C+ ^1 _0 c* {8 X
iteration 3, loglik = -232.9629484 }: x( v5 _ Q9 H& t1 R8 U
iteration 4, loglik = -223.323891
3 [9 d3 q3 K- D$ ~iteration 5, loglik = -207.630875
& H8 i* E3 M3 s# Qiteration 6, loglik = -191.0126977 b0 w5 v* u& z; k# g+ P
iteration 7, loglik = -178.611546
. F; d; h0 f, C, Niteration 8, loglik = -171.524132/ ?; `: b+ M- ~# ]0 H# w% ^
iteration 9, loglik = -168.626526
/ h3 _ |8 l( N2 h Biteration 10, loglik = -167.3870571 A$ y5 {' w( \9 o9 M! `
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 / o& q% Y$ m6 d) L- y& ^( O
prior2 = 0.0000+ Y7 O4 f# P( D+ w9 G7 T. s
0.0000$ Y/ C- c: D. Q* z
1.0000- r1 N! b+ H: n% L! x5 [. f
0.0000
! d" T1 R' L( S 0.0000
/ J+ Y- }+ b( y: v1 A$ B$ wtransmat2 =
0.0138 0.0089 0.7680 0.1060 0.1033
/ ]/ H% ^0 U/ ^ 0.7811 0.0000 0.0199 0.0067 0.1923
; e9 E! I3 c# ^& @4 |) F. E! L 0.0000 0.9936 0.0000 0.0064 0.00006 _% j0 E& k K" N& B0 Y+ ?
0.1686 0.2604 0.2242 0.3398 0.0070
; n/ s9 t( `" g+ ?4 X 0.0053 0.0406 0.8350 0.1184 0.0007 6 q, ?/ n1 V, Z- E4 D
obsmat2 = 0.0000 0.2351 0.5738 0.0256 0.1118 0.0186 0.0351: A# e: l8 G1 O: F1 a& p6 I. D
0.0000 0.8270 0.0000 0.0790 0.0256 0.0456 0.0228
, ~; l+ M8 o4 w( R# `7 e& y 0.7514 0.0021 0.0011 0.0550 0.1472 0.0432 0.0000
$ B$ x8 a! ]' Q4 E1 y" w 0.0014 0.4208 0.0447 0.4366 0.0023 0.0887 0.0055
5 `+ D y4 ?2 ] 0.0000 0.0784 0.3223 0.2014 0.0116 0.1525 0.2338 iteration 1, loglik = -277.738670
. i9 u. ?: j, T7 A1 V- yiteration 2, loglik = -242.163247- B0 ~5 W6 W+ A) D0 _0 W9 [5 J) k( O
iteration 3, loglik = -238.321971" o4 P" D! z% ]$ q" W% K4 f9 O
iteration 4, loglik = -233.166746) R& V; K/ w+ s1 t" Q
iteration 5, loglik = -225.682259: f( f8 G! I" r9 Y
iteration 6, loglik = -214.560296
3 ?# Z. I# z2 W9 c7 s: X/ K8 ^iteration 7, loglik = -201.182015
6 }* ~4 `9 {$ F" n4 Fiteration 8, loglik = -189.4274534 {" u+ \4 `+ z. e7 B5 u
iteration 9, loglik = -179.156352# [# m* [$ [$ P( B/ T! i
iteration 10, loglik = -171.7440967 }4 h$ t. A& X( l( M' X
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 $ B. I. s$ H, i! ?% x
prior4 = 0.00004 Z' H$ n g; R9 h$ _ G: K
0.9982- S; H# G4 \) f5 X* \
0.0004, {) T' a- q7 ?4 U2 R. Q9 i
0.0014
8 |# V( @' U8 ] o 0.0000 9 N2 K: V# T5 e# r7 b0 `9 g
transmat4 = 0.0873 0.5277 0.2799 0.1007 0.0045
3 r h$ H# @* ^0 @5 _: [9 a* g9 r 0.0002 0.0000 0.0005 0.0000 0.99940 p% I/ {0 Z9 H$ Z
0.0180 0.0000 0.0118 0.0011 0.9692
) E# n. l4 L8 y# W* k& M3 L' a 0.0436 0.0226 0.0810 0.0219 0.83108 k$ K( k: [* l- y/ G
0.9746 0.0056 0.0003 0.0195 0.0000 * O/ A" c4 Y+ l* G
obsmat4 = 0.0000 0.2012 0.5080 0.0580 0.1093 0.0465 0.0770
* O) j1 _2 U3 d F+ r 0.7939 0.0001 0.0000 0.0745 0.1277 0.0038 0.0000
( b( P1 L" x& n. I 0.4120 0.1044 0.0049 0.1736 0.0032 0.3017 0.0001
& v$ C& v( s5 t) X 0.4527 0.0622 0.0637 0.2568 0.0549 0.0295 0.0802
2 K: @/ F/ c) @% x! `& }4 b 0.0000 0.8172 0.0000 0.0943 0.0270 0.0389 0.0225
6 }, T- T( g. {# a# u( |data1 =
5 2 4 1 2 2 5 2 3 7 1 6 2 % h: }& s; O, W0 Q. W+ E, {% v7 Z
loglik = -19.2351 1 L7 F9 v/ b# l' w5 g7 n
loglik2 = -21.0715
7 m' I$ j/ N* x" g+ |path =
3 2 5 3 2 1 3 2 1 5 3 2 1 ; q! \) I8 y' h
path2 = 2 5 1 2 5 1 2 5 1 1 2 5 1
' n5 n9 w# T ]3 w5 W! Vfuhe =
1 |