% ①定义一个HMM并训练这个HMM。7 J# B0 x/ F% J; L
% ②用一组观察值测试这个HMM,计算该组观察值域HMM的匹配度。
9 p% `4 Y0 D8 g5 D+ U4 H% 修改:旺齐齐 g- e4 b' h w* _
% 修改部分为:添加 HMM2 模型。测试一个观察序列更加符合哪个哪个HMM模型。, ]+ h2 ~" j9 U7 _. x
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % O:观察状态数- Q# a/ P5 y# ~2 G/ F
O = 7;
& [" ]$ I: \) P7 _ vO2 = 7;! S0 C3 x, b/ L& j" p( Z3 m& m
% Q:HMM状态数
( X' ]8 K' n- ?4 \1 XQ = 5;
& y d# {( a O# AQ2 = 5;
' S2 x* j2 \$ n3 }%训练的数据集,每一行数据就是一组训练的观察值/ K/ o" x3 P6 a7 h
data=[1,2,3,1,2,2,4,2,3,1,2,7,2;
+ j+ N: [2 {, T' S# H0 B 1,2,3,6,2,2,1,4,3,1,5,3,1;
6 s! |, J, t% L* G. H. u0 W0 }5 _! | 1,2,3,1,2,5,1,2,4,1,2,3,2;
- C V( Z# {5 Y) Y5 ? s 1,2,7,1,2,2,1,2,5,1,2,4,1;
7 L, u1 }* M3 c8 X8 p! b, | 5,2,3,3,5,2,1,2,3,1,2,3,6;
0 k% |* B* n# E* k0 p: Q 1,2,3,1,2,2,1,6,5,1,2,6,4;& X, ?* S; Y: f' y: b
5,2,3,4,4,2,1,2,3,1,2,5,6;* N# F! N& E" N$ b
1,2,6,1,2,2,1,2,3,1,4,3,2;
' k$ i1 L' V- z4 V. E3 y! X 1,2,3,4,2,7,1,4,3,1,7,3,3;
9 i' @# C7 m4 h7 y1 s 5,2,3,5,2,2,1,2,3,1,2,3,4;6 m$ V7 x7 e5 f$ p2 M
5,2,4,1,2,2,5,2,3,7,1,6,2;] - \. n0 t& E/ E9 M; d3 y/ a* s- u
data2 = [1,2,3,1,2,2,4,2,3,1,2,7,2;& ~2 g' c* f; J/ ~; o/ o O
1,2,3,6,2,2,1,4,3,1,5,3,1;
$ p: q: W2 j) Q0 h- i: @7 n% l 1,2,3,1,2,5,1,2,4,1,2,3,2;
- X) G W4 n' l3 p: V3 p 1,2,7,1,2,2,1,2,5,1,2,4,1;
- Q3 @0 w8 W" c% M! X! X 5,2,3,3,5,2,1,2,3,1,2,3,6;
7 Y! s9 a) x, T& d0 |/ E% s2 c 1,2,3,1,2,2,1,6,5,1,2,6,4;9 {9 H! Y' i9 H" ]8 |% q
5,2,3,4,4,2,1,2,3,1,2,5,6;
' R/ W4 P' b" p& d u9 L 1,2,6,1,2,2,1,2,3,1,4,3,2;
! K1 D+ I4 {; Y# J7 m% e* N+ ~ 1,2,3,4,2,7,1,4,3,1,7,3,3;
% K; d) U3 W; t 5,2,3,5,2,2,1,2,3,1,2,3,4;! A2 e) }6 D' j8 g2 a# n1 {" L
4,2,5,1,2,2,6,2,3,7,1,6,4;] % initial guess of parameters
. r" V( G! W) F! L7 g/ t) t. y% 初始化参数
& D8 y8 X' w# _prior1 = normalise(rand(Q,1));2 N5 B* n3 ~ T$ e1 f9 h) O
transmat1 = mk_stochastic(rand(Q,Q));- S! h Z# h% h$ R; O; y- q
obsmat1 = mk_stochastic(rand(Q,O)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9 L: w4 o' I2 @6 g
% 添加部分
3 Y* u# h" P6 o' W+ j/ m* ~ prior3 = normalise(rand(Q2,1));2 L6 Q E- H S& M' i. J! g2 ^7 N G: {
transmat3 = mk_stochastic(rand(Q2,Q2));9 J' x0 Y l# X: u0 S& k# d
obsmat3 = mk_stochastic(rand(Q2,O2));
# N5 L6 k* v: Y o$ q) K0 ?%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % improve guess of parameters using EM; b& S! I& @0 f. U) i6 h
% 用data数据集训练参数矩阵形成新的HMM模型
/ w& p, e- ]( o( i, h) Q[LL, prior2, transmat2, obsmat2] = dhmm_em(data, prior1, transmat1, obsmat1, 'max_iter', size(data,1));
, N% M& r8 Q- ^& r! c. y% 训练后那行观察值与HMM匹配度9 J+ l1 d% Z: j; q4 q3 X" G
LL+ `) b7 L9 g) L6 h( z& e* [
% 训练后的初始概率分布
9 S6 q3 W8 I( G# @prior2+ q% Q. m. l. ?
% 训练后的状态转移概率矩阵- z/ P6 G, B- x t
transmat2
' x3 ~& h. S/ B9 ^/ S2 ?, E+ `% 观察值概率矩阵; |& Z1 r( P) e6 K
obsmat2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% W- e$ d. \, t" O4 r! t$ V% 添加部分
+ w9 Z' x) }8 z' e/ Y4 H" B [LL2, prior4, transmat4, obsmat4] = dhmm_em(data2, prior3, transmat3, obsmat3, 'max_iter', size(data2,1));. Q* R8 S: `6 {+ X) ^) ^$ f/ E( t6 O
LL2
, [! b4 e3 h. ^7 {9 y6 N9 o prior4# F, N" N" g+ q
transmat4
& t8 {9 ?# i: p/ _" ]4 N obsmat4# [. s9 Y6 m6 Z
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % use model to compute log likelihood
, D! Z& g8 L. {, e9 @% data1=[1,2,3,1,2,2,1,2,3,1,2,3,1]
$ L5 [% V4 p( t+ _( g7 k0 X# U& Zdata1 = [5,2,4,1,2,2,5,2,3,7,1,6,2]: Q" ^8 y/ e! a4 H9 Z- K5 S
loglik = dhmm_logprob(data1, prior2, transmat2, obsmat2)
' N- `3 L# s0 |: V2 j) b& w% log lik is slightly different than LL(end), since it is computed after the final M step
Z* H1 j* P j! c% loglik 代表着data和这个hmm(三参数为prior2, transmat2, obsmat2)的匹配值,越大说明越匹配,0为极大值。 % path为viterbi算法的结果,即最大概率path %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0 W. b% E. `6 k" E: ^% 添加部分
: C3 y+ `, e- T) U: X. k/ l, ]9 zloglik2 = dhmm_logprob(data1, prior4, transmat4, obsmat4)
" |* ?9 f; X! }- u$ H& @8 }%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ! |' X2 y% a0 g; [
B = multinomial_prob(data1,obsmat2);% M( X& }5 a$ Q/ m
path = viterbi_path(prior2, transmat2, B)4 | H; C9 D- }% d( }0 k1 s
save('sa.mat'); 8 e6 N: ]6 e( A) I p9 T0 w
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 R/ S. k O6 ~
% 添加部分0 _$ {. ]4 S6 {4 |( A
B2 = multinomial_prob(data1,obsmat4);: q, `5 M. I6 V b I/ ~, A
path2 = viterbi_path(prior4, transmat4, B2)
2 c# L/ j0 F1 i( { save('sa2.mat');' }% Y- L2 N/ K* {/ A
if loglik2 > loglik
% b: A) D! c; O9 |8 z& V+ d# j fuhe = 2+ |2 u2 p5 q, D- J8 `6 R
else1 x& p2 D1 ?5 ? ~: A0 f5 w H$ h
fuhe = 11 P; T* F- o0 w& U. a/ p* c
end % J1 E2 a6 c& i0 M* i% G
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ------ 运行结果 ------ data = 1 2 3 1 2 2 4 2 3 1 2 7 2
* V& P$ V; G- o* }2 g' _8 Q- L 1 2 3 6 2 2 1 4 3 1 5 3 1
+ m0 \; e1 w; J! a, W, j2 C" x 1 2 3 1 2 5 1 2 4 1 2 3 2. n" s" J) y3 F4 f4 R( H/ k
1 2 7 1 2 2 1 2 5 1 2 4 1
* U' t- e$ w: R6 V. a/ f a 5 2 3 3 5 2 1 2 3 1 2 3 6
8 p- ]8 h; @1 d0 r* z" c 1 2 3 1 2 2 1 6 5 1 2 6 4
# i: y& P- [: H5 S( `* l 5 2 3 4 4 2 1 2 3 1 2 5 6
% H. M e( }. e 1 2 6 1 2 2 1 2 3 1 4 3 2 g, L8 \# v8 f
1 2 3 4 2 7 1 4 3 1 7 3 3
8 J( X# f- ~, X, O# e: r 5 2 3 5 2 2 1 2 3 1 2 3 4
: B* k* b/ M+ t- D" l 5 2 4 1 2 2 5 2 3 7 1 6 2 3 j3 u8 T; \9 E- ^! I
data2 = 1 2 3 1 2 2 4 2 3 1 2 7 2, i) q7 W% V# i0 M
1 2 3 6 2 2 1 4 3 1 5 3 1
3 u6 o- d! \: c u: C 1 2 3 1 2 5 1 2 4 1 2 3 2' H9 _# o8 |0 \3 ?1 {/ @, |
1 2 7 1 2 2 1 2 5 1 2 4 1 v0 ~" j. Q! B" t& g
5 2 3 3 5 2 1 2 3 1 2 3 65 i* W2 a, P5 \; v" |
1 2 3 1 2 2 1 6 5 1 2 6 46 Q7 J6 x# f6 A9 c( r
5 2 3 4 4 2 1 2 3 1 2 5 6
9 k/ `; D$ Y: N! Q# [2 @- ` 1 2 6 1 2 2 1 2 3 1 4 3 2
. `* l6 e1 `% Q. P- p 1 2 3 4 2 7 1 4 3 1 7 3 3
& K' }8 v& h: D 5 2 3 5 2 2 1 2 3 1 2 3 48 i8 y/ B/ F3 |5 m( c2 Z' b# W1 ]
4 2 5 1 2 2 6 2 3 7 1 6 4 iteration 1, loglik = -327.100465# j- G9 n6 [4 E7 F( W K
iteration 2, loglik = -238.259812( @2 F+ ]) J7 Q' t$ B8 ^
iteration 3, loglik = -232.962948
: J0 p6 T; \* t8 S {; p* siteration 4, loglik = -223.3238914 k2 f0 \9 i% N7 X
iteration 5, loglik = -207.630875+ @& L) v& Z* T1 `) D. g
iteration 6, loglik = -191.012697
" |; i6 C4 v) Yiteration 7, loglik = -178.6115467 U: f4 s9 [6 V$ L! ?
iteration 8, loglik = -171.524132; U5 |$ }9 ^$ \4 b) k5 {3 d
iteration 9, loglik = -168.626526" v( z, G' j% { o& P! ~: {6 \: T" R, R
iteration 10, loglik = -167.3870573 N7 g$ V; t, Q' F( 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
2 X9 T- [+ G: D! e8 L: Q) Qprior2 =
0.0000
- i! f5 g1 \* B, E2 m r2 Z 0.0000
( {3 J: s; I- f* a ^+ p 1.0000) ~. P4 _, C7 y
0.0000
. P' _" E& ]2 C l0 A4 ], i 0.0000
# w# `; j' s! ]. {& S6 C5 u" |transmat2 =
0.0138 0.0089 0.7680 0.1060 0.1033, z2 G6 {+ |6 Z: ^) |% H
0.7811 0.0000 0.0199 0.0067 0.1923
& m; B8 Y U. N$ l; Y0 p 0.0000 0.9936 0.0000 0.0064 0.00003 p: E' b. b* x R3 i% k7 J" v4 B
0.1686 0.2604 0.2242 0.3398 0.0070
) }/ v" M6 C6 R* Z8 ~* ^& P4 A" J 0.0053 0.0406 0.8350 0.1184 0.0007
/ W! e" G* ~. d/ U2 |; w4 X. oobsmat2 =
0.0000 0.2351 0.5738 0.0256 0.1118 0.0186 0.0351( N. L+ x) t% X$ }& X7 `9 [& [
0.0000 0.8270 0.0000 0.0790 0.0256 0.0456 0.0228, ~1 Z/ @7 t( H- t; d
0.7514 0.0021 0.0011 0.0550 0.1472 0.0432 0.0000! i7 |* Y f) G5 H
0.0014 0.4208 0.0447 0.4366 0.0023 0.0887 0.0055
4 n4 ^4 e g! T. A9 v8 | 0.0000 0.0784 0.3223 0.2014 0.0116 0.1525 0.2338 iteration 1, loglik = -277.738670
7 F. r! o) v. Yiteration 2, loglik = -242.163247
# W2 ] f' y% Y* {0 N0 u5 e1 C# `iteration 3, loglik = -238.3219713 k: ?! O# ?8 @; S _
iteration 4, loglik = -233.166746
0 x1 u: r9 a2 n) g2 C4 G2 `; Giteration 5, loglik = -225.682259
+ d( ~0 a( F# @, ~- J! iiteration 6, loglik = -214.560296& k" q( ? V4 O, E
iteration 7, loglik = -201.182015# {5 P7 \, x ^
iteration 8, loglik = -189.4274537 e! A: I4 S* x
iteration 9, loglik = -179.156352$ k8 T6 I' z+ C( }/ g
iteration 10, loglik = -171.744096. w0 ^5 I0 y3 S0 j$ N
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 - v: R. C% [5 d5 O
prior4 = 0.00007 q/ U4 M. H: v- L2 g$ z8 a
0.9982
$ r6 S6 E" ~& b7 S" F; Z( a; W+ s 0.0004
7 j6 O" G \4 I; R0 o 0.0014
* V5 {3 n) _0 \, s 0.0000
- |: n- ` L2 ]9 Utransmat4 =
0.0873 0.5277 0.2799 0.1007 0.0045
- @, t2 R6 [0 u0 K. W4 L9 L 0.0002 0.0000 0.0005 0.0000 0.9994% h2 i2 S; K' F
0.0180 0.0000 0.0118 0.0011 0.9692% _. J9 t$ q: M& g9 E
0.0436 0.0226 0.0810 0.0219 0.8310$ G4 d5 `* A) x( O9 I n7 Y, `, f" T
0.9746 0.0056 0.0003 0.0195 0.0000
2 U* l% [2 M: s* @0 f7 ?obsmat4 =
0.0000 0.2012 0.5080 0.0580 0.1093 0.0465 0.0770, s3 b6 R- [4 G& a' L0 T5 F
0.7939 0.0001 0.0000 0.0745 0.1277 0.0038 0.0000/ X) `, N# g: F
0.4120 0.1044 0.0049 0.1736 0.0032 0.3017 0.0001
( H. j7 _4 g1 _; X- W7 F5 N 0.4527 0.0622 0.0637 0.2568 0.0549 0.0295 0.0802
0 G: `, C5 ~6 Y5 W9 N6 m 0.0000 0.8172 0.0000 0.0943 0.0270 0.0389 0.0225 - A' h1 o7 X* r& E' f/ j% x1 ]
data1 = 5 2 4 1 2 2 5 2 3 7 1 6 2
7 r8 A) R* j, Y( d' R3 }loglik =
-19.2351
. J3 ^8 M1 ~; t. q' }% @' uloglik2 =
-21.0715 - h7 D) Y5 E; z0 p9 [+ s6 k* L
path = 3 2 5 3 2 1 3 2 1 5 3 2 1
6 r: M* `( l% n8 @. @path2 =
2 5 1 2 5 1 2 5 1 1 2 5 1 . E7 R* v* {9 { q ^
fuhe = 1 |