% ①定义一个HMM并训练这个HMM。
2 V7 ~' J9 [' _: Y% ②用一组观察值测试这个HMM,计算该组观察值域HMM的匹配度。, { I9 G* m. }: U8 v9 |: j8 h
% 修改:旺齐齐
0 x0 f4 R) V2 g) o% 修改部分为:添加 HMM2 模型。测试一个观察序列更加符合哪个哪个HMM模型。1 l9 ~1 V v9 t! D2 z5 A
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % O:观察状态数+ K. H. L0 a0 ?0 f |& e
O = 7;7 X$ k) S: y2 N& G9 ~
O2 = 7;
/ \7 h+ ?. l, n% Q:HMM状态数/ Q, s; ` G9 [) B. x9 Y. M" U+ p6 a
Q = 5;
* j1 M" I6 E: {$ P- P; z( W' GQ2 = 5;
" l4 | R; W- }. W( E%训练的数据集,每一行数据就是一组训练的观察值
' M* K' W+ \7 b X( l- V+ x, r9 t/ Wdata=[1,2,3,1,2,2,4,2,3,1,2,7,2;' l3 E) |$ ?7 v: y
1,2,3,6,2,2,1,4,3,1,5,3,1;% x+ }3 l7 u; V, u/ q, W
1,2,3,1,2,5,1,2,4,1,2,3,2;! E! }4 t8 K- }# a8 k; N$ m; m
1,2,7,1,2,2,1,2,5,1,2,4,1;4 ]) f3 [6 H# b' u
5,2,3,3,5,2,1,2,3,1,2,3,6;
+ s9 o1 z: r9 J 1,2,3,1,2,2,1,6,5,1,2,6,4;
$ d1 K U0 i# {# s! _* c) g- c 5,2,3,4,4,2,1,2,3,1,2,5,6;
# m' g( @9 @2 u! _ 1,2,6,1,2,2,1,2,3,1,4,3,2;1 |1 ^' ~9 a7 N+ X$ V" z4 g% s
1,2,3,4,2,7,1,4,3,1,7,3,3;7 K$ _4 b6 U8 ` {3 A' j
5,2,3,5,2,2,1,2,3,1,2,3,4;4 {4 R% z$ q# S5 \. X9 Y
5,2,4,1,2,2,5,2,3,7,1,6,2;] * F# ^7 a' G3 D8 S. r. E) X1 c7 [) R: o
data2 = [1,2,3,1,2,2,4,2,3,1,2,7,2;
5 K, E- `) z4 B6 m# R! v5 i# B 1,2,3,6,2,2,1,4,3,1,5,3,1;
% g5 W. |; a b: z 1,2,3,1,2,5,1,2,4,1,2,3,2;! m9 e j* M- d* i; m, x" z- D
1,2,7,1,2,2,1,2,5,1,2,4,1; I+ s- b; C C% c+ q0 Y& W+ |
5,2,3,3,5,2,1,2,3,1,2,3,6;2 x3 @. h9 z4 [2 w7 O$ i' _
1,2,3,1,2,2,1,6,5,1,2,6,4;
- v% C8 p& g* h! ] e' [ 5,2,3,4,4,2,1,2,3,1,2,5,6;8 d# {) ?3 D% o3 r W" A8 ?3 n. R
1,2,6,1,2,2,1,2,3,1,4,3,2;
, a6 S' R+ S9 ?/ L& Y 1,2,3,4,2,7,1,4,3,1,7,3,3;
$ x5 S; L$ x9 F9 \- N% g' E. q8 f& ~ 5,2,3,5,2,2,1,2,3,1,2,3,4; [, _, A+ C& U- B" l
4,2,5,1,2,2,6,2,3,7,1,6,4;] % initial guess of parameters
# e3 V" ^0 V+ {; O# S) A% 初始化参数
p0 j e5 u' I Xprior1 = normalise(rand(Q,1));: f/ n9 c$ V8 a& m$ A
transmat1 = mk_stochastic(rand(Q,Q));6 j1 M6 T; d/ a9 _: L( t" u* D
obsmat1 = mk_stochastic(rand(Q,O)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%* o1 V" A: O8 t/ S `) K# ^
% 添加部分* F# U; }- o; d; p1 q. ?4 l, _9 H
prior3 = normalise(rand(Q2,1));
3 q4 |4 \# m P) L9 H1 l4 c; ] transmat3 = mk_stochastic(rand(Q2,Q2));
4 |0 l+ ^$ ^7 a( j4 d. W% O$ d obsmat3 = mk_stochastic(rand(Q2,O2));4 z% s4 k% j+ c$ b, s. M, ~& E
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % improve guess of parameters using EM
$ E2 J& w0 R( s6 w! ^- M% 用data数据集训练参数矩阵形成新的HMM模型4 P- e: \1 T- q' \% Q7 O* a+ j4 G
[LL, prior2, transmat2, obsmat2] = dhmm_em(data, prior1, transmat1, obsmat1, 'max_iter', size(data,1));
! y" o) ?9 H) e P9 g- x9 r3 L% 训练后那行观察值与HMM匹配度8 k) a, t C% t |$ P
LL1 I$ P; s5 X; h! I7 W4 P( K5 o
% 训练后的初始概率分布
! w y J4 m& I# fprior2
+ X% x! E4 V8 w4 E S0 E% 训练后的状态转移概率矩阵
* L {# b0 A! |- K" Y! atransmat2
; a! {# D+ Y/ D) h1 G+ a/ }& y% 观察值概率矩阵
5 Z% f; ^$ A5 g) g0 ]) R# E9 dobsmat2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 M) C+ a' n1 |
% 添加部分5 e! Q( J4 ]9 Q
[LL2, prior4, transmat4, obsmat4] = dhmm_em(data2, prior3, transmat3, obsmat3, 'max_iter', size(data2,1));
/ m% {" b! @/ m5 U* b LL26 e+ j1 L& \- E1 u) f, o$ z
prior4
) w, r( Q8 @& w transmat45 h, @+ A; [2 I0 w" |) {) S
obsmat4
/ i- y! K3 ]4 E, c5 t2 D%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % use model to compute log likelihood
6 D1 O+ Z! s- j8 x% data1=[1,2,3,1,2,2,1,2,3,1,2,3,1]
9 j( q, T) G8 d; `6 l5 O# fdata1 = [5,2,4,1,2,2,5,2,3,7,1,6,2]( w2 X& y. [: m( S: {
loglik = dhmm_logprob(data1, prior2, transmat2, obsmat2)/ F) U. }+ b1 C( h$ f: h
% log lik is slightly different than LL(end), since it is computed after the final M step
3 M' u4 |4 d& \8 E3 O% loglik 代表着data和这个hmm(三参数为prior2, transmat2, obsmat2)的匹配值,越大说明越匹配,0为极大值。 % path为viterbi算法的结果,即最大概率path %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 S0 W; K! E5 E7 Y( O" |7 f
% 添加部分
9 c9 @/ B( [# W7 N+ ploglik2 = dhmm_logprob(data1, prior4, transmat4, obsmat4)8 h2 q, Z- w+ \$ N% P
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6 z& Y# K" ^7 R3 `4 ]7 |B = multinomial_prob(data1,obsmat2);+ n m5 r2 H4 m8 |% ~
path = viterbi_path(prior2, transmat2, B)+ E9 z0 C6 V/ Y, ~) Z
save('sa.mat');
- |$ U% h( e1 t4 N$ l%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9 D9 N4 S/ y5 Q9 O5 ?0 X8 p* w
% 添加部分2 E/ Z* f: |4 M$ A
B2 = multinomial_prob(data1,obsmat4);
6 U& h3 Q& @5 Z7 X' m path2 = viterbi_path(prior4, transmat4, B2)
( H& c$ v" _# a8 f/ E: @) M, c3 V( ? save('sa2.mat');3 o8 s m2 W1 s! a5 b y( K, C' G
if loglik2 > loglik
# }. x$ e4 ?, E' w6 J fuhe = 2
* Y' A3 b K& ] J& [" m c* N else
; Q. X1 E) R& }& e9 @ fuhe = 1' R3 j) m! e$ ^
end
0 Z% S' d2 _. m" H+ R w4 v%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
------ 运行结果 ------ data = 1 2 3 1 2 2 4 2 3 1 2 7 2
; x2 E3 c, m. h 1 2 3 6 2 2 1 4 3 1 5 3 1
5 E$ K6 s- A! F( r2 X, E4 G5 \8 ? 1 2 3 1 2 5 1 2 4 1 2 3 2# F, }1 F2 @( [/ Q! p3 J5 l
1 2 7 1 2 2 1 2 5 1 2 4 15 E3 c* o4 O6 d0 G8 e# b
5 2 3 3 5 2 1 2 3 1 2 3 6
3 L4 N( m7 V9 W7 @) G0 C 1 2 3 1 2 2 1 6 5 1 2 6 4
, m. t. p5 r4 ^/ v( ]% J% n 5 2 3 4 4 2 1 2 3 1 2 5 6
2 f8 U; M2 \3 I; U4 `1 ^ 1 2 6 1 2 2 1 2 3 1 4 3 2
. o, i2 G" L: Z7 W; v. D 1 2 3 4 2 7 1 4 3 1 7 3 3
" W4 N2 P! d1 O, h n3 t1 X 5 2 3 5 2 2 1 2 3 1 2 3 46 o" x6 h1 i* I- w8 b( k
5 2 4 1 2 2 5 2 3 7 1 6 2
% }8 Y3 {7 C% d- d0 u( \data2 =
1 2 3 1 2 2 4 2 3 1 2 7 2; c' N- A5 ~- w& Y
1 2 3 6 2 2 1 4 3 1 5 3 1) w! J; o- [/ e9 X/ \9 {
1 2 3 1 2 5 1 2 4 1 2 3 2' ^" K/ Z( ?( A- M& v. D+ m
1 2 7 1 2 2 1 2 5 1 2 4 1
8 v2 r* g% B% ~8 Z& I+ D& k 5 2 3 3 5 2 1 2 3 1 2 3 6" G" n' Z7 ~! E
1 2 3 1 2 2 1 6 5 1 2 6 4
" h3 x2 p3 Y7 ]7 s3 q) X4 m 5 2 3 4 4 2 1 2 3 1 2 5 63 l5 e$ m8 \3 g! Q; v+ j9 a
1 2 6 1 2 2 1 2 3 1 4 3 2
8 L3 N- u U; j4 P& G 1 2 3 4 2 7 1 4 3 1 7 3 3
. }7 I$ V& ]( B& F6 ` 5 2 3 5 2 2 1 2 3 1 2 3 4
7 T# C3 h8 p7 U. ?- D' j1 O 4 2 5 1 2 2 6 2 3 7 1 6 4 iteration 1, loglik = -327.1004655 W9 n" r+ t+ s& F. d/ r
iteration 2, loglik = -238.259812+ R8 Q. d: z) g) [8 j
iteration 3, loglik = -232.962948+ h K5 L. I* }0 H5 \" ~' @( l
iteration 4, loglik = -223.323891
# e0 x7 N5 j. Y" r+ E5 Jiteration 5, loglik = -207.6308752 b0 c, u2 d5 f3 q1 i
iteration 6, loglik = -191.012697
+ D. E% H! b; T) B% Viteration 7, loglik = -178.6115460 O$ i& M( W+ z
iteration 8, loglik = -171.524132' D$ m) A9 o3 U! X9 L3 u
iteration 9, loglik = -168.626526
# k/ U# d8 v" W0 w* b5 Uiteration 10, loglik = -167.387057
* ~3 ]) R6 n0 e# v/ z7 Diteration 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 7 G& w& s# f% u
prior2 = 0.0000
7 u: T* l2 M* b6 | 0.00006 b) |" M( n w( V; s0 u
1.0000( i2 l/ D' \2 @2 P
0.0000# l" Q+ k6 b. v6 O5 D3 @# K
0.0000
* B! h* k0 ]) {8 G$ F: |transmat2 =
0.0138 0.0089 0.7680 0.1060 0.1033
* E3 w! L, Q9 y8 d 0.7811 0.0000 0.0199 0.0067 0.1923
. p8 c& x" n( }; [& q s9 i! d' S 0.0000 0.9936 0.0000 0.0064 0.00000 E& m# D7 C" j9 N2 {9 o1 ?
0.1686 0.2604 0.2242 0.3398 0.0070
, c# N/ u7 y$ V( M 0.0053 0.0406 0.8350 0.1184 0.0007
+ V$ J1 J% {6 `; n8 ^. y( {# k) Vobsmat2 =
0.0000 0.2351 0.5738 0.0256 0.1118 0.0186 0.03518 J2 Z5 I3 u8 Y7 M: `
0.0000 0.8270 0.0000 0.0790 0.0256 0.0456 0.0228, @* @' k( [# f; B) M- r/ _
0.7514 0.0021 0.0011 0.0550 0.1472 0.0432 0.0000
, k+ [. U. P4 ]$ Q- b 0.0014 0.4208 0.0447 0.4366 0.0023 0.0887 0.0055* n9 e+ G5 {8 s% z
0.0000 0.0784 0.3223 0.2014 0.0116 0.1525 0.2338 iteration 1, loglik = -277.738670
y7 u4 e2 `/ a6 \& G* U6 yiteration 2, loglik = -242.163247
4 l' J( ^& u( s* ]. j a" niteration 3, loglik = -238.321971" P! q8 y2 n; s9 ~5 R: W
iteration 4, loglik = -233.166746
; M4 F& H6 G) g! b2 `! ^iteration 5, loglik = -225.682259
1 t" U3 n) P3 ^( ] e7 }* Riteration 6, loglik = -214.560296
6 E0 w5 k, e, G& s; K& d/ @iteration 7, loglik = -201.182015% \! e- T9 f6 l+ ]; e6 a1 @# i
iteration 8, loglik = -189.427453) C# R# K! P7 \9 e
iteration 9, loglik = -179.156352
' j7 N/ V& \0 t4 ?3 F* g( \iteration 10, loglik = -171.744096
+ t: m: v+ y2 D, k% l5 _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
1 S5 Q' K9 H8 G3 i* Vprior4 =
0.00007 H. s- \: ^1 o% O+ H
0.99828 W2 \; [/ q8 A g8 G9 ]; Q9 g$ ^( L
0.0004
: d& Z4 K% T* I- y+ } 0.0014
- w2 J0 K0 K5 z+ b4 E3 g 0.0000 ) Q( d: j# K( K2 w/ X
transmat4 = 0.0873 0.5277 0.2799 0.1007 0.0045: t( ?' L# u9 p7 g
0.0002 0.0000 0.0005 0.0000 0.9994, k2 o9 I. c; ~" z6 s) y9 ~3 q
0.0180 0.0000 0.0118 0.0011 0.9692
7 f9 V* E* ?8 o7 N& o 0.0436 0.0226 0.0810 0.0219 0.8310
) E R2 c2 W2 d. X; R( k) x( V 0.9746 0.0056 0.0003 0.0195 0.0000
; b- h' o: k& J9 J- [ E; Nobsmat4 =
0.0000 0.2012 0.5080 0.0580 0.1093 0.0465 0.0770 {7 x' U' E# i9 ]
0.7939 0.0001 0.0000 0.0745 0.1277 0.0038 0.0000* L( i9 n' M+ J7 d4 j7 `3 o% ?
0.4120 0.1044 0.0049 0.1736 0.0032 0.3017 0.0001- b/ O( Z" r: v8 K, |! p" N/ c6 b4 a
0.4527 0.0622 0.0637 0.2568 0.0549 0.0295 0.0802
( P& o c6 d6 n; K) j8 ] 0.0000 0.8172 0.0000 0.0943 0.0270 0.0389 0.0225
# Y* y" z& _& T3 o3 ?3 y" J6 fdata1 =
5 2 4 1 2 2 5 2 3 7 1 6 2 9 q& w3 m8 }- H* p# @
loglik = -19.2351 & o( s0 g5 x/ u; G
loglik2 = -21.0715 ( k3 y3 ]0 T4 }* r/ T$ W; p3 _
path = 3 2 5 3 2 1 3 2 1 5 3 2 1
+ `' P/ D* |0 L( K6 T7 S" z7 J- epath2 =
2 5 1 2 5 1 2 5 1 1 2 5 1 ' R. s9 j( F, d: ?" Q: k( B% G
fuhe = 1 |