% ①定义一个HMM并训练这个HMM。
1 P5 p0 c5 m7 l$ \2 {- g% ②用一组观察值测试这个HMM,计算该组观察值域HMM的匹配度。3 b7 V k0 \7 L* T
% 修改:旺齐齐
3 V0 I* b) i# q+ B1 [8 S, v# u9 D% 修改部分为:添加 HMM2 模型。测试一个观察序列更加符合哪个哪个HMM模型。
4 ^! i; F0 j! `# Q, D%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % O:观察状态数0 [% N8 }3 g7 i, S9 w, w; g
O = 7;
3 b% u" Y! E) t. G$ J% f: z* NO2 = 7;. [' Y; b. r) ~5 r8 E
% Q:HMM状态数' x; }* ?+ u$ N6 ~, T1 v+ ?
Q = 5;$ P( d* t! V4 f8 V4 a2 r1 ^
Q2 = 5;$ b7 i: E2 z/ F: _# q
%训练的数据集,每一行数据就是一组训练的观察值
- } F: _3 {: L3 Xdata=[1,2,3,1,2,2,4,2,3,1,2,7,2;" n4 Q. l; v0 R' K
1,2,3,6,2,2,1,4,3,1,5,3,1;
- m& z0 ?2 X8 d; z6 O8 \ 1,2,3,1,2,5,1,2,4,1,2,3,2;
( q7 i" l ?. d4 O2 z 1,2,7,1,2,2,1,2,5,1,2,4,1;
. U3 T9 f( W8 E9 E 5,2,3,3,5,2,1,2,3,1,2,3,6;+ n5 g4 Y! m; M
1,2,3,1,2,2,1,6,5,1,2,6,4;
2 ?% p% ^# P9 O* v/ l 5,2,3,4,4,2,1,2,3,1,2,5,6;
" Y2 r4 @2 G( A 1,2,6,1,2,2,1,2,3,1,4,3,2;
9 z0 t# e% |( j7 V$ c1 P& r$ g: ` 1,2,3,4,2,7,1,4,3,1,7,3,3;
! r& V6 L8 r* q1 L& \; Z# l 5,2,3,5,2,2,1,2,3,1,2,3,4;
9 p0 |9 b, I) N4 }: @ 5,2,4,1,2,2,5,2,3,7,1,6,2;] & M* _- [: E4 [
data2 = [1,2,3,1,2,2,4,2,3,1,2,7,2;
# c, h/ z# p) g" D/ r& k/ j2 C 1,2,3,6,2,2,1,4,3,1,5,3,1;
) X( c, C& R/ ^1 l6 g+ V6 { 1,2,3,1,2,5,1,2,4,1,2,3,2;
3 v/ c% L: v# L" z 1,2,7,1,2,2,1,2,5,1,2,4,1;' S) A; l) L6 i: [
5,2,3,3,5,2,1,2,3,1,2,3,6;1 |. J7 v6 }/ A1 J
1,2,3,1,2,2,1,6,5,1,2,6,4;
! I: t$ G/ W1 [3 Z( [2 R 5,2,3,4,4,2,1,2,3,1,2,5,6;4 w& ?2 ]6 A u9 N
1,2,6,1,2,2,1,2,3,1,4,3,2;) f5 `: C+ ~& |& a/ m
1,2,3,4,2,7,1,4,3,1,7,3,3;
9 c% i/ J! i, W/ q 5,2,3,5,2,2,1,2,3,1,2,3,4;
/ I) }. K* l. l3 V# }( I+ d 4,2,5,1,2,2,6,2,3,7,1,6,4;] % initial guess of parameters
7 _' ?) I+ {/ W Q% 初始化参数
8 g# b5 }( o. z' Gprior1 = normalise(rand(Q,1));4 r% w5 T) x% R, i) n; A$ w( h& [- ~
transmat1 = mk_stochastic(rand(Q,Q));" V) U1 F3 ]- @6 H
obsmat1 = mk_stochastic(rand(Q,O)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 T/ S" D) a1 g4 r$ j
% 添加部分8 m- Y) h& z2 x
prior3 = normalise(rand(Q2,1));
% c0 M3 X0 w+ e transmat3 = mk_stochastic(rand(Q2,Q2));- l- n+ S2 J* F
obsmat3 = mk_stochastic(rand(Q2,O2));
) A( V: [# `8 E2 Q8 N3 r' |%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % improve guess of parameters using EM
4 n0 E; t) f3 `' g3 D W; i5 Z% 用data数据集训练参数矩阵形成新的HMM模型/ n1 t7 m0 R( H# U
[LL, prior2, transmat2, obsmat2] = dhmm_em(data, prior1, transmat1, obsmat1, 'max_iter', size(data,1));/ r0 `6 X$ n* z6 i- b
% 训练后那行观察值与HMM匹配度1 {) u: \% z! v" L& c
LL
/ {* W* z# ?: [. n( P" h1 b* b6 k% 训练后的初始概率分布
8 c; H4 [) I4 m4 |7 {prior2$ Q$ }8 x, Z' d3 Y3 M7 _
% 训练后的状态转移概率矩阵, m" T! {" @5 K8 `8 v* ~
transmat2
4 p; h) O5 @3 u/ {$ g4 N% 观察值概率矩阵. a* p9 `* L% G, a9 j M
obsmat2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 A" B' L V5 q% r) |2 m; m# ~1 O
% 添加部分1 |4 @+ ^% K# k
[LL2, prior4, transmat4, obsmat4] = dhmm_em(data2, prior3, transmat3, obsmat3, 'max_iter', size(data2,1));
! V* N! F. a$ a LL2' W" B F- w$ l2 a# r
prior4) p% T9 U J5 y7 @4 G o
transmat4
) E- F( B( D- z$ R) J- h1 {1 S. p obsmat4
( s$ ` I! y3 F%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % use model to compute log likelihood. d A- d; p3 u7 y1 N! ~# V, `
% data1=[1,2,3,1,2,2,1,2,3,1,2,3,1]) ]0 p! p& Q. n8 P
data1 = [5,2,4,1,2,2,5,2,3,7,1,6,2]" J3 J1 P6 X# q! f2 b7 }+ A/ Q
loglik = dhmm_logprob(data1, prior2, transmat2, obsmat2)
# d8 j1 n2 [# F. q% log lik is slightly different than LL(end), since it is computed after the final M step: b. K7 t3 b& N+ }( K3 D; T8 U
% loglik 代表着data和这个hmm(三参数为prior2, transmat2, obsmat2)的匹配值,越大说明越匹配,0为极大值。 % path为viterbi算法的结果,即最大概率path %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
, a" @. v0 Q. W: L% 添加部分
! g( `; t! d3 n1 z ^loglik2 = dhmm_logprob(data1, prior4, transmat4, obsmat4)9 w8 |: A9 I4 u) `' _5 t
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1 k! g1 @) E, Q" ]+ Q, a# r( x+ V" LB = multinomial_prob(data1,obsmat2);
/ d! v8 ? x* C8 ?" l* Mpath = viterbi_path(prior2, transmat2, B)
/ |8 [2 Z: q- d6 [3 a9 usave('sa.mat');
" q e7 U9 u& g; `%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%, h0 M3 q/ H9 G
% 添加部分" s" _" A+ ?; U( c* J6 T
B2 = multinomial_prob(data1,obsmat4);. f7 g( R5 U& N. C+ D
path2 = viterbi_path(prior4, transmat4, B2)
8 I! M* m+ \( V! {, L5 o! V save('sa2.mat');
* j9 Q- W( T) E$ ? if loglik2 > loglik
2 i0 Q$ w) {! W: m9 T" b- U$ u fuhe = 22 U2 }; U6 ^1 h8 p6 B3 o9 Q: [. U
else
+ l; w- S5 [5 N) I fuhe = 1$ E( X/ O" Y$ q( S
end
6 ], ^* n+ z0 S" J4 f, d, h%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
------ 运行结果 ------ data = 1 2 3 1 2 2 4 2 3 1 2 7 2
) H. L* w) z2 p# J2 S" H. r 1 2 3 6 2 2 1 4 3 1 5 3 16 m0 w, V& i$ Y3 j) d# S
1 2 3 1 2 5 1 2 4 1 2 3 24 c* N% f' A5 ^& l- V; F& |7 |
1 2 7 1 2 2 1 2 5 1 2 4 1
) x( g f" p- P* }9 |) m 5 2 3 3 5 2 1 2 3 1 2 3 6 g& d3 o, D: f3 s0 X C
1 2 3 1 2 2 1 6 5 1 2 6 4
& \; w% Q. m9 f7 k7 g! U" \9 _ 5 2 3 4 4 2 1 2 3 1 2 5 6) t- [" B. c; q8 v' X" }; D6 r
1 2 6 1 2 2 1 2 3 1 4 3 2
5 {$ ]1 Z2 [! q0 D/ w ]% j5 ^, o! F 1 2 3 4 2 7 1 4 3 1 7 3 3
+ }3 a" R' Z, f% B+ z' H- y 5 2 3 5 2 2 1 2 3 1 2 3 4
9 O2 X% ]2 X( E. [7 P& a 5 2 4 1 2 2 5 2 3 7 1 6 2 ) A- C3 M" ~0 y) n% V% o5 b/ w
data2 = 1 2 3 1 2 2 4 2 3 1 2 7 2
6 q" [4 z* n4 V4 l( k 1 2 3 6 2 2 1 4 3 1 5 3 16 w3 q/ K1 i2 E- _+ R0 I" p; ?
1 2 3 1 2 5 1 2 4 1 2 3 2
% W C2 ?% M/ ^6 A 1 2 7 1 2 2 1 2 5 1 2 4 12 z/ s k" g) Q1 H" _, y
5 2 3 3 5 2 1 2 3 1 2 3 6
: H, m: [0 J$ K& W 1 2 3 1 2 2 1 6 5 1 2 6 4
. W3 u7 L: t6 B6 K 5 2 3 4 4 2 1 2 3 1 2 5 69 V _- n; Q$ f# L
1 2 6 1 2 2 1 2 3 1 4 3 23 W4 R0 u, ]" {
1 2 3 4 2 7 1 4 3 1 7 3 3
7 d& f* o% Z: F& O 5 2 3 5 2 2 1 2 3 1 2 3 4) m$ ~" i6 E! {, t1 s- l
4 2 5 1 2 2 6 2 3 7 1 6 4 iteration 1, loglik = -327.100465
- g/ J1 y: _# k( i- H# N2 {iteration 2, loglik = -238.2598126 ?6 S* b1 V5 b* a% L. Z# M
iteration 3, loglik = -232.9629480 X. Y7 o0 Y3 U3 \
iteration 4, loglik = -223.3238910 u: Q& ~2 U( k( k. m5 x
iteration 5, loglik = -207.630875. w6 j. z) V5 Q: m* L: W' |+ Y* {8 J8 K
iteration 6, loglik = -191.012697
! O, g- ]* O. }4 P7 Miteration 7, loglik = -178.6115462 A/ E# X& v \4 W" g; V# v4 M
iteration 8, loglik = -171.524132
7 F' h4 ~/ T' Biteration 9, loglik = -168.626526
, V( [( F* I2 O( Q: {iteration 10, loglik = -167.387057! z4 q5 E/ d B+ s. k! V% [
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. a, [- Z6 [
prior2 = 0.0000
, f& b- Y9 _3 _ 0.00006 R) ]9 H4 P- q5 A1 W# t6 ~
1.0000
+ }8 C0 l2 h8 o+ K8 t 0.00008 w3 ~) H- G' s! l6 o6 _2 t$ ]
0.0000
0 k/ n; w8 d$ q; D' dtransmat2 =
0.0138 0.0089 0.7680 0.1060 0.1033, x# `( a3 B+ b4 @7 j/ Q
0.7811 0.0000 0.0199 0.0067 0.1923
* W4 s- i b* ?, _ 0.0000 0.9936 0.0000 0.0064 0.0000, d$ }( P4 N6 p8 h! `
0.1686 0.2604 0.2242 0.3398 0.0070
9 K* F* Q" e+ U* C 0.0053 0.0406 0.8350 0.1184 0.0007
5 n' c$ z7 c8 `, F" i, Mobsmat2 =
0.0000 0.2351 0.5738 0.0256 0.1118 0.0186 0.0351
6 P7 Z* W5 A% y0 f- @* C$ K n 0.0000 0.8270 0.0000 0.0790 0.0256 0.0456 0.0228& p0 B9 ^7 u# K- V
0.7514 0.0021 0.0011 0.0550 0.1472 0.0432 0.0000
/ I2 k; }( D* `( L3 r | 0.0014 0.4208 0.0447 0.4366 0.0023 0.0887 0.00553 N; X( ^1 h2 a
0.0000 0.0784 0.3223 0.2014 0.0116 0.1525 0.2338 iteration 1, loglik = -277.738670# |2 V/ q/ _; S5 R0 w: U2 I
iteration 2, loglik = -242.163247
% ?$ K( o' t' C+ N! Y; riteration 3, loglik = -238.321971* N6 u! k& C$ O
iteration 4, loglik = -233.1667462 }/ T2 }8 G0 h5 d" Q" G
iteration 5, loglik = -225.682259" V" f; Z, J0 }7 \# F) G# I
iteration 6, loglik = -214.560296
/ x* _+ M% X2 m* q) `) q# j+ Citeration 7, loglik = -201.182015! i, }3 S& f5 M- F, V, V
iteration 8, loglik = -189.427453
% }. g% h" M) d' D. {3 y" Fiteration 9, loglik = -179.156352
2 ]8 H. @& q; h' v; h+ biteration 10, loglik = -171.7440967 Q; A+ _2 {: c3 g9 V
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 ; H, Y1 X4 ^4 V! m3 V7 G! D
prior4 = 0.0000
$ ~+ ?) ]% @2 x0 H 0.9982
% i" u$ \, u) a% C 0.0004! O& ?9 L' J W, k
0.0014
2 Z$ M8 X* P: s% O# V5 B 0.0000
% |, F" z1 g1 V% a8 qtransmat4 =
0.0873 0.5277 0.2799 0.1007 0.00454 f. f- y& w9 G1 _/ r' ~) B
0.0002 0.0000 0.0005 0.0000 0.9994% \: y7 G* D5 m8 G6 Q
0.0180 0.0000 0.0118 0.0011 0.96928 R1 u1 O! c; e/ K! Q5 w- z
0.0436 0.0226 0.0810 0.0219 0.8310
g- M! s) E; t8 j# C0 } 0.9746 0.0056 0.0003 0.0195 0.0000 - P" B' V! I: E
obsmat4 = 0.0000 0.2012 0.5080 0.0580 0.1093 0.0465 0.0770" K% H1 M4 y) h3 p$ Z
0.7939 0.0001 0.0000 0.0745 0.1277 0.0038 0.0000
; {( B1 I" q! a F8 \2 J 0.4120 0.1044 0.0049 0.1736 0.0032 0.3017 0.0001
* y- s+ p) b! D; i! u1 l S i* e5 Z 0.4527 0.0622 0.0637 0.2568 0.0549 0.0295 0.0802
: y/ `% [' O1 ~9 c/ Q% m# j3 R 0.0000 0.8172 0.0000 0.0943 0.0270 0.0389 0.0225
7 [) t& r( ], ~; R0 ddata1 =
5 2 4 1 2 2 5 2 3 7 1 6 2
+ p0 i) Z. ?7 X9 V) hloglik =
-19.2351
n) I4 W3 u0 r3 m3 g. [. A, uloglik2 =
-21.0715
, w1 {( w" m' S0 i6 ]path =
3 2 5 3 2 1 3 2 1 5 3 2 1
1 T" W. K* B2 F3 ^% Ppath2 =
2 5 1 2 5 1 2 5 1 1 2 5 1
6 {7 G' u$ J; `" ^, }fuhe =
1 |