% ①定义一个HMM并训练这个HMM。8 ~* i, I: _, C( h& M+ q, Q
% ②用一组观察值测试这个HMM,计算该组观察值域HMM的匹配度。) o% e) ]! S9 T& d1 q6 ^
% 修改:旺齐齐
# [ L) y& G6 @0 Z9 |% 修改部分为:添加 HMM2 模型。测试一个观察序列更加符合哪个哪个HMM模型。4 _& c+ Z9 l/ G# p; Q" T2 D
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % O:观察状态数 \7 d: J# w& l @0 X2 f( Q$ Z' c
O = 7;
9 r- g. u* I4 t: p! ?6 l' BO2 = 7;( L2 G. `$ B" t
% Q:HMM状态数
& L, l7 c$ ^- i9 mQ = 5;
3 l* M2 Q0 K) p8 ^Q2 = 5;$ L9 y: [0 x) V7 R; w
%训练的数据集,每一行数据就是一组训练的观察值
S- j" d7 y3 H9 ]. Jdata=[1,2,3,1,2,2,4,2,3,1,2,7,2;
9 n$ A c } Y: u6 V 1,2,3,6,2,2,1,4,3,1,5,3,1;" {# p; B2 R9 v. S: g1 ?; `
1,2,3,1,2,5,1,2,4,1,2,3,2;2 d2 v5 N1 v) y& a9 Y2 S
1,2,7,1,2,2,1,2,5,1,2,4,1;
: b2 F( F2 w, a6 h 5,2,3,3,5,2,1,2,3,1,2,3,6;* p3 N0 n1 M8 N# E: S* I( Y6 n' L, f! ^
1,2,3,1,2,2,1,6,5,1,2,6,4;
; K# |7 S3 m: p 5,2,3,4,4,2,1,2,3,1,2,5,6;. ?% b2 A2 A. K2 V' Q
1,2,6,1,2,2,1,2,3,1,4,3,2;
* ~, j( u, Q0 T 1,2,3,4,2,7,1,4,3,1,7,3,3;$ J g$ F6 ]7 G" c" w6 B: o1 m$ v
5,2,3,5,2,2,1,2,3,1,2,3,4;% @) u* G$ [+ J0 z% q6 z% v, n
5,2,4,1,2,2,5,2,3,7,1,6,2;] 2 T. |$ `4 V Y" v( K- M: p1 j
data2 = [1,2,3,1,2,2,4,2,3,1,2,7,2;) k4 C6 c" z& ^6 Y
1,2,3,6,2,2,1,4,3,1,5,3,1;
3 f- O! G+ G5 z. L% E" U 1,2,3,1,2,5,1,2,4,1,2,3,2;
+ Q9 g9 O, N8 J: b8 u/ X2 p- c 1,2,7,1,2,2,1,2,5,1,2,4,1;* g! m# [8 m1 \ r6 o4 n7 |
5,2,3,3,5,2,1,2,3,1,2,3,6;
1 t. E! y" s8 N0 \7 | 1,2,3,1,2,2,1,6,5,1,2,6,4;
: M( }9 p' L; h0 S& T 5,2,3,4,4,2,1,2,3,1,2,5,6; [! e, Q v0 B% ~' \7 J0 ?
1,2,6,1,2,2,1,2,3,1,4,3,2;
; q8 |" _0 H$ ]5 B 1,2,3,4,2,7,1,4,3,1,7,3,3;
" }6 Y# `3 e. F. v1 S# Q! D* W 5,2,3,5,2,2,1,2,3,1,2,3,4;" ^8 u: b) P. i5 V
4,2,5,1,2,2,6,2,3,7,1,6,4;] % initial guess of parameters# ]$ f5 z9 J4 d5 r b& r! B# [/ ^! q
% 初始化参数
7 O" g p$ _8 J* Nprior1 = normalise(rand(Q,1));
4 U% ?4 o& s9 ~0 h# P( K1 W* q4 a1 etransmat1 = mk_stochastic(rand(Q,Q));
$ v. l& M1 j5 |! Q9 x+ W, e$ Vobsmat1 = mk_stochastic(rand(Q,O)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%; d$ G) m3 e |0 {/ J; |1 u
% 添加部分
6 r# n( p3 m3 t prior3 = normalise(rand(Q2,1));: v8 t8 @ p( t6 ?" Q& K/ Y
transmat3 = mk_stochastic(rand(Q2,Q2));
, f7 I7 k0 `4 U obsmat3 = mk_stochastic(rand(Q2,O2));
! y8 j! ?0 ]9 m" [3 u%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % improve guess of parameters using EM* `) T, e$ d/ k
% 用data数据集训练参数矩阵形成新的HMM模型) e& e$ [5 _! z1 D$ V$ ^
[LL, prior2, transmat2, obsmat2] = dhmm_em(data, prior1, transmat1, obsmat1, 'max_iter', size(data,1));
2 w2 j# Q, Z& [$ k( \% 训练后那行观察值与HMM匹配度
8 @* v3 U% d* c& N! f) eLL( K$ v' p" v' \' Y- M2 m$ a. B
% 训练后的初始概率分布
; Y' j: a8 X: E' r" ?7 E7 Gprior24 a; I; F8 d& k$ g" o: A: w
% 训练后的状态转移概率矩阵% S$ F9 I4 N8 g
transmat2
- ^* G/ F: w, I4 X! z9 |: a) y% 观察值概率矩阵
" z. @7 m" G5 m. K& S M% iobsmat2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
* M& u5 Y# P% i1 j, g% 添加部分( e5 U7 k8 x' Q" g5 v( r# z z
[LL2, prior4, transmat4, obsmat4] = dhmm_em(data2, prior3, transmat3, obsmat3, 'max_iter', size(data2,1));
/ A/ k0 s+ R; _" k LL2
$ z; `: R# v- V$ \1 m$ I prior4. T1 G0 \8 n1 g/ Z# ^, I1 C% }& m
transmat4# W' y5 U, h9 T& s, }$ F" p
obsmat4
- F3 S# r3 v/ ~) C3 D& S5 r%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % use model to compute log likelihood, q$ W0 E% |; |. z/ Y, S, A) N1 O
% data1=[1,2,3,1,2,2,1,2,3,1,2,3,1]- m" q3 ` W. m# N; J- r7 l- U* h/ |
data1 = [5,2,4,1,2,2,5,2,3,7,1,6,2]' q) J$ j& U% d" N* H
loglik = dhmm_logprob(data1, prior2, transmat2, obsmat2)+ h# w$ ^2 V4 J+ `# @
% log lik is slightly different than LL(end), since it is computed after the final M step
3 f' W9 t# p4 e% loglik 代表着data和这个hmm(三参数为prior2, transmat2, obsmat2)的匹配值,越大说明越匹配,0为极大值。 % path为viterbi算法的结果,即最大概率path %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
* F, M- H; @7 L; ^7 s( q! Z% 添加部分0 y8 U2 ?* R# {. O. K3 Q
loglik2 = dhmm_logprob(data1, prior4, transmat4, obsmat4)' O* E: y* P2 z9 M* ^9 b2 z& C
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
) z: `7 V" m+ fB = multinomial_prob(data1,obsmat2);+ ~: O& ^( i3 ~8 r
path = viterbi_path(prior2, transmat2, B)
5 T3 A! E1 i4 y: F+ [+ f/ Gsave('sa.mat');
2 u) z' T* B# x% v%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
/ {" @4 j# N& N* ?& G; J$ S3 T% 添加部分
+ X# [# t2 s3 ?. _. G, C+ H" g B2 = multinomial_prob(data1,obsmat4);
5 |9 d* L! _' o; n path2 = viterbi_path(prior4, transmat4, B2)
" }. n/ B: |1 n/ k; U save('sa2.mat');* H7 E0 L( D7 Z7 D) m* w2 E
if loglik2 > loglik 6 g- v, ^: n# f' E
fuhe = 2! R) i9 Y' c; c3 C# y5 z6 Y5 _
else+ f- t5 G7 I# S$ K( n0 a* K% N
fuhe = 1
& T S) g ]$ |) Y. U end
! y0 V4 m1 b9 _% ^: b0 s% ^%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
------ 运行结果 ------ data = 1 2 3 1 2 2 4 2 3 1 2 7 2
" F: d* L# x( k! v% B+ m4 ^ 1 2 3 6 2 2 1 4 3 1 5 3 1
7 t) \8 q$ m& h 1 2 3 1 2 5 1 2 4 1 2 3 2, v3 t! [1 U) Q0 @
1 2 7 1 2 2 1 2 5 1 2 4 1
- v0 u1 H8 ^4 G; l 5 2 3 3 5 2 1 2 3 1 2 3 6& ^: Z9 c+ a0 K
1 2 3 1 2 2 1 6 5 1 2 6 4" u& B! \ S5 Z
5 2 3 4 4 2 1 2 3 1 2 5 63 I y! ~! z4 ?& ~
1 2 6 1 2 2 1 2 3 1 4 3 2! a/ D" k* G8 X+ t8 {
1 2 3 4 2 7 1 4 3 1 7 3 3
3 {1 Z7 `* ~& Z: b 5 2 3 5 2 2 1 2 3 1 2 3 46 C D) @, U8 j) j
5 2 4 1 2 2 5 2 3 7 1 6 2
0 D- ]" {+ O d6 rdata2 =
1 2 3 1 2 2 4 2 3 1 2 7 2
8 `, x- f3 q! s4 Y: A3 j 1 2 3 6 2 2 1 4 3 1 5 3 1
( z/ W' w8 r1 s, s5 [ 1 2 3 1 2 5 1 2 4 1 2 3 2
# p8 |0 F" _" K1 k 1 2 7 1 2 2 1 2 5 1 2 4 1
9 W9 @" @. b! D. o3 S 5 2 3 3 5 2 1 2 3 1 2 3 6# ]" M4 P$ `0 _3 X& h
1 2 3 1 2 2 1 6 5 1 2 6 4
* l) l$ Q/ I; P$ ~ 5 2 3 4 4 2 1 2 3 1 2 5 6, R- s, l7 t* j8 Y) s
1 2 6 1 2 2 1 2 3 1 4 3 2+ Z6 [) b! J5 [- a- G$ b \0 y
1 2 3 4 2 7 1 4 3 1 7 3 3 @5 E0 L8 `) `& W! |
5 2 3 5 2 2 1 2 3 1 2 3 45 S( Q2 \* J% s' R) F* e. V" T2 ^+ C
4 2 5 1 2 2 6 2 3 7 1 6 4 iteration 1, loglik = -327.100465, o. S4 H5 z: u* g
iteration 2, loglik = -238.259812* v5 w( {) e4 R( B x
iteration 3, loglik = -232.962948
0 z& X$ G" Q. [5 A" v8 F$ A& citeration 4, loglik = -223.323891
. p- }2 o: o- e& Y4 diteration 5, loglik = -207.630875
) ]7 p6 ]( q2 z# witeration 6, loglik = -191.012697+ Y' B1 u1 ] {/ e2 _
iteration 7, loglik = -178.6115465 a! S" Y6 A6 F1 F( Q
iteration 8, loglik = -171.524132
$ A9 @( g8 {) ] k' }" o$ I: Literation 9, loglik = -168.6265266 ^$ B- ]( Z8 d7 `' M
iteration 10, loglik = -167.3870570 Q7 ~( t! A, X/ g$ t
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 3 S3 Z. i* {" Z: a+ v
prior2 = 0.0000+ k" i; X9 `$ K K5 G
0.0000; z5 Z+ _ L3 a3 a5 w# w
1.0000
) j2 y$ Q5 S" s) f) C 0.0000
1 P# z2 ?8 I! m, k 0.0000 1 ~9 l2 b8 _1 ?
transmat2 = 0.0138 0.0089 0.7680 0.1060 0.1033# y- |$ P! m2 u' X* \6 J7 [- \" c
0.7811 0.0000 0.0199 0.0067 0.1923" w6 U/ ^. ?5 K4 ~1 r: s9 G
0.0000 0.9936 0.0000 0.0064 0.0000
4 h C) m" \. ] 0.1686 0.2604 0.2242 0.3398 0.0070
* C' p7 s! o2 B# B i 0.0053 0.0406 0.8350 0.1184 0.0007 ) d' w# P0 W2 A9 @5 F
obsmat2 = 0.0000 0.2351 0.5738 0.0256 0.1118 0.0186 0.0351 F. `+ a0 x" H) J. P/ q
0.0000 0.8270 0.0000 0.0790 0.0256 0.0456 0.0228! q0 ?/ {: k$ c& t/ r$ d( h+ T
0.7514 0.0021 0.0011 0.0550 0.1472 0.0432 0.0000 N; S; E& Z. [' q" p; K# O
0.0014 0.4208 0.0447 0.4366 0.0023 0.0887 0.00555 L' l& v* B. j& p9 ~; {/ V$ s8 B
0.0000 0.0784 0.3223 0.2014 0.0116 0.1525 0.2338 iteration 1, loglik = -277.738670 Y. c) G" V2 {, `* i7 W2 g
iteration 2, loglik = -242.163247- E. E! d4 ~$ i& ?6 ^
iteration 3, loglik = -238.321971/ j& n' m- S3 r1 B! ^- k$ R! J9 t
iteration 4, loglik = -233.166746) t; f4 u, f0 Y8 r. p# I
iteration 5, loglik = -225.682259
; g* e/ k* O5 U6 {iteration 6, loglik = -214.5602961 o6 D1 E4 B, V# N2 B) c, c
iteration 7, loglik = -201.182015
$ W. E7 n5 s" C* l5 i% \' titeration 8, loglik = -189.427453% ?& G) E, g% r! @3 N. D: \
iteration 9, loglik = -179.1563520 V( p) u; _) h9 c! A
iteration 10, loglik = -171.7440964 ~9 D! `4 P8 y" `( ^% u
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 8 X3 X s- _" D! d& _
prior4 = 0.0000
1 U1 o' E& W1 f- f7 O; } 0.99826 L7 ?3 t2 n8 a; B* o5 p4 v1 T
0.0004
, ~2 _) D6 q2 y7 C% X" W: m 0.0014
0 p# H7 R2 u6 o. c: o- O1 O/ F6 m 0.0000
) E0 a5 t$ L* Wtransmat4 =
0.0873 0.5277 0.2799 0.1007 0.0045. c. ^: L1 a7 X1 C* ?) T
0.0002 0.0000 0.0005 0.0000 0.9994
+ s0 C5 d' @# l 0.0180 0.0000 0.0118 0.0011 0.9692
0 j& B/ |( H. v4 a: U# E+ x 0.0436 0.0226 0.0810 0.0219 0.8310
0 Z& Y# ?; s* V* C 0.9746 0.0056 0.0003 0.0195 0.0000
6 G$ _/ J5 @7 S) a* s+ yobsmat4 =
0.0000 0.2012 0.5080 0.0580 0.1093 0.0465 0.07705 c! s' d0 y% w; \+ w! ^
0.7939 0.0001 0.0000 0.0745 0.1277 0.0038 0.00002 D6 n, _. H. r* A) v f) Z
0.4120 0.1044 0.0049 0.1736 0.0032 0.3017 0.0001
% P- ~! h+ ]# z/ |- h 0.4527 0.0622 0.0637 0.2568 0.0549 0.0295 0.0802
. f2 D2 |7 g3 ^1 p7 p4 p 0.0000 0.8172 0.0000 0.0943 0.0270 0.0389 0.0225 ' f/ Y# }$ B( g9 C# x6 }0 k9 C
data1 = 5 2 4 1 2 2 5 2 3 7 1 6 2
" j$ N5 s9 a1 X+ q+ g9 n5 Nloglik =
-19.2351
% f3 ^, Q* Z) q4 kloglik2 =
-21.0715
5 _0 X+ M: \/ c" ^# {path =
3 2 5 3 2 1 3 2 1 5 3 2 1 6 Q `+ ^' \5 U# t* C
path2 = 2 5 1 2 5 1 2 5 1 1 2 5 1
; U+ M9 y& | L: T7 Pfuhe =
1 |