% ①定义一个HMM并训练这个HMM。; Q; c+ N8 F( K' E l7 U4 b7 ?9 P
% ②用一组观察值测试这个HMM,计算该组观察值域HMM的匹配度。0 Z( N7 X O6 Z* D* p7 J- w
% 修改:旺齐齐4 Y0 G+ b7 W" Z
% 修改部分为:添加 HMM2 模型。测试一个观察序列更加符合哪个哪个HMM模型。 g% t/ l$ G9 w% n* O: M+ g3 o9 g
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % O:观察状态数: T& c$ b) p5 e/ G2 m
O = 7;
9 V$ R7 w) N0 X) S4 Q; S) @9 NO2 = 7;
1 R" j5 w; D+ A, Q9 R% Q:HMM状态数
2 L4 }$ J; b5 V0 n, A8 IQ = 5;
$ ]9 f- Z% |- xQ2 = 5;
, r4 [$ ]: A' d%训练的数据集,每一行数据就是一组训练的观察值
0 N$ m$ J+ Y' ]6 Y/ b3 A# v- gdata=[1,2,3,1,2,2,4,2,3,1,2,7,2;
# U8 m- ]& [( [4 i' | 1,2,3,6,2,2,1,4,3,1,5,3,1;
; ?5 M" ]: y j- I3 [ 1,2,3,1,2,5,1,2,4,1,2,3,2;
5 G( V" y! Z: E' @' k8 e 1,2,7,1,2,2,1,2,5,1,2,4,1;( w. W- U, _* S+ D7 w
5,2,3,3,5,2,1,2,3,1,2,3,6;6 g& \! }% Y' u7 F; u* K, }0 A
1,2,3,1,2,2,1,6,5,1,2,6,4;% }" U& ]2 |" i8 c/ s0 e' R2 L
5,2,3,4,4,2,1,2,3,1,2,5,6;$ s" ]- T. E+ u. f. r
1,2,6,1,2,2,1,2,3,1,4,3,2;" E' S# ^/ x( b8 t
1,2,3,4,2,7,1,4,3,1,7,3,3;. V) Y/ \8 ^7 y5 G
5,2,3,5,2,2,1,2,3,1,2,3,4;
7 E3 R% A: t) @ 5,2,4,1,2,2,5,2,3,7,1,6,2;]
: j6 r/ Y* o' n8 U: t data2 = [1,2,3,1,2,2,4,2,3,1,2,7,2;
; o: P% z5 O3 ]* K 1,2,3,6,2,2,1,4,3,1,5,3,1;6 v: f l# I/ n6 H) w
1,2,3,1,2,5,1,2,4,1,2,3,2;/ m/ v) T3 F7 B) D* c
1,2,7,1,2,2,1,2,5,1,2,4,1;9 _& y, A1 G/ s, k3 i- Q* Y
5,2,3,3,5,2,1,2,3,1,2,3,6;
3 y% z, R* |* e ]/ R 1,2,3,1,2,2,1,6,5,1,2,6,4;2 l. o2 P4 b$ P# _4 \
5,2,3,4,4,2,1,2,3,1,2,5,6;
9 }# U6 t" g9 x+ C# Z5 ~, B, s! m 1,2,6,1,2,2,1,2,3,1,4,3,2;
3 p( Z) w) X) i, ]( P# h6 N 1,2,3,4,2,7,1,4,3,1,7,3,3;' O# ^3 Y5 K) c2 Q" Z+ t2 l/ O5 F H
5,2,3,5,2,2,1,2,3,1,2,3,4;
; K" G7 H! L5 H/ B# B; U8 Z 4,2,5,1,2,2,6,2,3,7,1,6,4;]
% initial guess of parameters# i* j" [- s$ I$ U8 H6 W
% 初始化参数/ a, B0 w. ^" T& W& ]1 s; H- Z' _ d, U
prior1 = normalise(rand(Q,1));
; }4 b3 P$ G( T2 i6 @ qtransmat1 = mk_stochastic(rand(Q,Q));
, @, w0 B+ ^! \0 i$ k7 Nobsmat1 = mk_stochastic(rand(Q,O)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
* K/ N! D* Z( b4 @# _2 d% 添加部分: y- {$ Q: N- @& k* v% `( k
prior3 = normalise(rand(Q2,1));+ N/ G2 V9 p$ U* G* W3 Z7 s) r
transmat3 = mk_stochastic(rand(Q2,Q2));8 J h q7 i$ }
obsmat3 = mk_stochastic(rand(Q2,O2));" V" D8 v% W& ?
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % improve guess of parameters using EM5 L5 C9 _- ~# t$ j8 V. {; w" \
% 用data数据集训练参数矩阵形成新的HMM模型2 X. `: ?$ o9 a. C# O
[LL, prior2, transmat2, obsmat2] = dhmm_em(data, prior1, transmat1, obsmat1, 'max_iter', size(data,1));
9 S3 X. P2 s! U& o; z/ z8 r% 训练后那行观察值与HMM匹配度
: _. _! |/ F1 f0 y; ^3 BLL
" o* k0 B; d8 }! `$ K% 训练后的初始概率分布( d3 S, m% ]9 A9 Z% b$ s
prior2
; n4 |" I( Q3 a, B4 S% T$ x% 训练后的状态转移概率矩阵
$ j+ M. I% i& M& F1 G3 [transmat2* |: G$ } H' {4 o" K- z
% 观察值概率矩阵
$ }) c+ P% R2 B5 a; Aobsmat2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%' e3 n+ Q2 U7 T# q& A: D5 f9 m
% 添加部分( A- H/ J7 Z8 {( z9 z+ L! t# I
[LL2, prior4, transmat4, obsmat4] = dhmm_em(data2, prior3, transmat3, obsmat3, 'max_iter', size(data2,1));- H0 u! [5 W1 L
LL2
: @1 Q! L0 V9 O0 Z$ |4 Q prior49 H9 D _& Y* I& g
transmat4, z: I6 ^; G0 k
obsmat4
- I6 q* b+ F0 N% t: s) S%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % use model to compute log likelihood
5 p! t; J" \/ u: @9 \' n: k% data1=[1,2,3,1,2,2,1,2,3,1,2,3,1]
. J0 Q" p; M8 tdata1 = [5,2,4,1,2,2,5,2,3,7,1,6,2]& I0 b0 A6 |+ F: }
loglik = dhmm_logprob(data1, prior2, transmat2, obsmat2)
$ X5 T1 h& }: [; k0 ?# |+ s% log lik is slightly different than LL(end), since it is computed after the final M step
/ i& X* A6 C; L% loglik 代表着data和这个hmm(三参数为prior2, transmat2, obsmat2)的匹配值,越大说明越匹配,0为极大值。 % path为viterbi算法的结果,即最大概率path %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% q8 Z/ {0 Y" _( l( [( J- ?9 K
% 添加部分
V+ W4 q% r, Gloglik2 = dhmm_logprob(data1, prior4, transmat4, obsmat4)
7 F# v$ o- m' n3 `- n) Q8 @8 x* l \%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 9 _5 F+ l6 \5 ~$ [/ ^- R
B = multinomial_prob(data1,obsmat2);; K- t% U7 I- h: j8 o& Z* e
path = viterbi_path(prior2, transmat2, B)- X4 p& c2 `4 i
save('sa.mat');
( G& f$ [, j) X) ?- l%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 ?( G+ Y: r1 u' ]
% 添加部分0 r$ U, }' t+ H2 V8 p
B2 = multinomial_prob(data1,obsmat4);1 h. u& d; ~ S. |0 Y% e6 R
path2 = viterbi_path(prior4, transmat4, B2)
$ K; a3 t9 C8 v8 X save('sa2.mat');
& [* U7 ]3 d1 \ if loglik2 > loglik 5 h% E& A7 Z5 }' V
fuhe = 2
7 K2 H' o# l9 w. v else
& W) C3 C, n- T) H: A' _) \& ~* T) J fuhe = 1
9 S7 Q* O& X* R end
9 J+ O+ g3 Z! y! P%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
------ 运行结果 ------ data = 1 2 3 1 2 2 4 2 3 1 2 7 2- J, l% R9 D; r8 E' x
1 2 3 6 2 2 1 4 3 1 5 3 1
- m; h3 |# _) b( c( q2 G 1 2 3 1 2 5 1 2 4 1 2 3 2
4 }- y0 Z" j g3 B3 r2 o$ x: A7 K 1 2 7 1 2 2 1 2 5 1 2 4 1; V5 g- ~* h& d; S& I- V. c
5 2 3 3 5 2 1 2 3 1 2 3 68 e* s" I/ g: J; }' G$ y
1 2 3 1 2 2 1 6 5 1 2 6 4
$ h8 Z- N: C) i; s5 ^. e! e 5 2 3 4 4 2 1 2 3 1 2 5 6 `+ [2 a) k4 Q( G
1 2 6 1 2 2 1 2 3 1 4 3 2
' `7 _' ~. D! P% W& @0 K 1 2 3 4 2 7 1 4 3 1 7 3 3
: R5 S s; t/ _" Q, a2 f: a0 e 5 2 3 5 2 2 1 2 3 1 2 3 4& ` l2 E8 P0 a, {
5 2 4 1 2 2 5 2 3 7 1 6 2 # m) z/ }8 J) e8 S0 b- I
data2 = 1 2 3 1 2 2 4 2 3 1 2 7 2
9 N* M- u3 g( d5 z: T% @" } 1 2 3 6 2 2 1 4 3 1 5 3 1/ e- N* n! i7 x. |. h2 [
1 2 3 1 2 5 1 2 4 1 2 3 2
: R& h, O1 q* E2 w7 n2 G 1 2 7 1 2 2 1 2 5 1 2 4 1
8 c& G! K: S; _/ h 5 2 3 3 5 2 1 2 3 1 2 3 6; \2 y- B# \8 k5 ^/ D% c5 F- \
1 2 3 1 2 2 1 6 5 1 2 6 4
2 J# T: o# l) X/ O 5 2 3 4 4 2 1 2 3 1 2 5 6) p3 u4 S: A8 _0 V! V
1 2 6 1 2 2 1 2 3 1 4 3 2
9 L% V* @1 J! {; o6 A/ l 1 2 3 4 2 7 1 4 3 1 7 3 3
) E: Q, w% H: K% P7 G# G. j 5 2 3 5 2 2 1 2 3 1 2 3 4
1 k% E9 w2 W! e1 x! h2 v: x# L 4 2 5 1 2 2 6 2 3 7 1 6 4 iteration 1, loglik = -327.100465
+ g9 k0 j- P: f$ y, p; ~- Citeration 2, loglik = -238.259812
* [2 S, r! ?: C# {" m Y% Xiteration 3, loglik = -232.962948& o: s$ O. R# G# n; P
iteration 4, loglik = -223.3238918 z w3 f0 v' q# O3 @' F) Z
iteration 5, loglik = -207.630875
0 I+ J! I. f/ T' ]iteration 6, loglik = -191.012697$ m/ g- S, Y& D& U% l# Q
iteration 7, loglik = -178.611546
% d: t' l# |8 I$ f) }# Aiteration 8, loglik = -171.524132
- J3 w4 h) ~# q. W diteration 9, loglik = -168.626526
" b" |$ t$ ^/ B7 Q! S- Q, Xiteration 10, loglik = -167.387057 B2 D7 i# g- b! s! i
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
: W- y- y" d0 m8 c9 D) ^( @* J8 cprior2 =
0.0000* o# C5 T& p& Z& t0 E' s
0.0000
/ w0 C/ N& V9 E4 d6 d( C 1.00007 x" J% V- Z7 j+ a8 C2 b: \' F, w
0.0000
# g. |+ t) D2 k8 c2 j 0.0000 3 T1 [+ w/ _0 K' R4 t4 r6 j
transmat2 = 0.0138 0.0089 0.7680 0.1060 0.1033
5 [2 @. e" s. }6 \' a" _ ] 0.7811 0.0000 0.0199 0.0067 0.1923+ V3 ]& a/ q9 S6 S% E4 h
0.0000 0.9936 0.0000 0.0064 0.0000( t9 w: x6 B% t6 M
0.1686 0.2604 0.2242 0.3398 0.0070
& k8 n0 k* g! |8 Q" P9 f6 {. f 0.0053 0.0406 0.8350 0.1184 0.0007 1 v5 ]6 ~- v# o% j) ^
obsmat2 = 0.0000 0.2351 0.5738 0.0256 0.1118 0.0186 0.0351& [' {7 N& v1 c, C. C- c
0.0000 0.8270 0.0000 0.0790 0.0256 0.0456 0.0228$ @# Y% I" r# S, u$ @- J- k
0.7514 0.0021 0.0011 0.0550 0.1472 0.0432 0.00008 a6 E, S# W4 G9 m( l( h& k2 ~
0.0014 0.4208 0.0447 0.4366 0.0023 0.0887 0.0055" V0 m$ J! H* S3 w! m
0.0000 0.0784 0.3223 0.2014 0.0116 0.1525 0.2338 iteration 1, loglik = -277.7386709 a% s2 Z e) X& E& w: ?8 R
iteration 2, loglik = -242.163247
0 m( M' [2 C9 Y* q" h: k8 ?iteration 3, loglik = -238.321971
d4 p- i" b3 z9 @+ U! \$ \3 Titeration 4, loglik = -233.166746
. n4 ?$ a1 A6 Iiteration 5, loglik = -225.682259/ F4 L+ X& N% i5 I) E) Y0 M: a5 c4 { v
iteration 6, loglik = -214.5602968 N2 m& c& C- V5 `, W" ?
iteration 7, loglik = -201.182015 M X" U/ V" w
iteration 8, loglik = -189.427453
/ f) t% s7 A4 `0 a- m0 e! Riteration 9, loglik = -179.156352
D3 w7 j! J2 X5 e% {. K/ Fiteration 10, loglik = -171.744096& J, i4 u7 B w4 s# Z
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! _7 D8 _% F) | xprior4 =
0.0000. f5 x! p/ K1 \: a9 M$ H
0.9982
+ C4 J7 h6 E" r! ^0 m- s5 [( O 0.0004
* g0 k' f* y& m, Y 0.0014! o+ l# {* M/ M, X0 m2 }6 m
0.0000
# `9 H9 U4 b4 P. c7 j- \transmat4 =
0.0873 0.5277 0.2799 0.1007 0.0045
& \2 g' M; W2 C& X 0.0002 0.0000 0.0005 0.0000 0.9994
1 i/ k) B1 N ^ 0.0180 0.0000 0.0118 0.0011 0.96929 s$ o! M! g9 @9 `1 O* b
0.0436 0.0226 0.0810 0.0219 0.8310' g9 y% u6 K/ f' S
0.9746 0.0056 0.0003 0.0195 0.0000 ' k! n* I3 ], b8 s M6 g5 I
obsmat4 = 0.0000 0.2012 0.5080 0.0580 0.1093 0.0465 0.0770( n1 e8 l7 C: H/ V2 b; e4 s/ O9 ~0 ?. K/ p
0.7939 0.0001 0.0000 0.0745 0.1277 0.0038 0.0000
+ H' K m' X) g# [ Q 0.4120 0.1044 0.0049 0.1736 0.0032 0.3017 0.00019 {7 Q1 ~# @1 f: }% ^. D
0.4527 0.0622 0.0637 0.2568 0.0549 0.0295 0.0802
: o- u8 b& n- T: x, h$ {$ ^ 0.0000 0.8172 0.0000 0.0943 0.0270 0.0389 0.0225 6 Q% L1 y! q6 F/ j
data1 = 5 2 4 1 2 2 5 2 3 7 1 6 2
8 a$ ]& o1 J* x9 i X" U) `& j6 Tloglik =
-19.2351
e7 r, J* X. [: S; ]9 r! wloglik2 =
-21.0715
! d6 f* y, E8 ?9 V4 S' Ppath =
3 2 5 3 2 1 3 2 1 5 3 2 1
& v) L( o2 a+ y: t( \* `path2 =
2 5 1 2 5 1 2 5 1 1 2 5 1 5 E" B# c2 M9 a& j
fuhe = 1 |