数学建模社区-数学中国

标题: 隐马尔科夫HMM在matlab实现的两个例子如何读懂,附HMM工具箱 [打印本页]

作者: 杨利霞    时间: 2020-5-9 17:36
标题: 隐马尔科夫HMM在matlab实现的两个例子如何读懂,附HMM工具箱

( a2 U4 h1 J9 `7 |2 b隐马尔科夫HMM在matlab实现的两个例子如何读懂,附HMM工具箱& e# N6 ^$ f$ ]' M
% ①定义一个HMM并训练这个HMM。& Y0 w( l9 q6 m' S! y
% ②用一组观察值测试这个HMM,计算该组观察值域HMM的匹配度。8 Q5 n: g) ]  i
% 修改:旺齐齐
/ x% R! j+ N8 t+ r5 u, e% 修改部分为:添加 HMM2 模型。测试一个观察序列更加符合哪个哪个HMM模型。
  \! ]- E4 ~2 ^%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% O:观察状态数
* Z) a. p0 o! B8 d0 a7 RO = 7;- k/ P. C" i% L$ {
O2 = 7;
& x0 p8 X) _0 O% Q:HMM状态数5 [3 q( n4 c6 ]+ C! _, A6 g, p$ J
Q = 5;
- u% b7 E. l' i6 m- o) [* }2 @Q2 = 5;0 r5 s' N3 u* {
%训练的数据集,每一行数据就是一组训练的观察值8 r% h1 _. v6 L9 w9 B$ x
data=[1,2,3,1,2,2,4,2,3,1,2,7,2;* N( P( k! \" {8 p; m3 ~2 o& W4 ^
      1,2,3,6,2,2,1,4,3,1,5,3,1;; y& U$ C7 j8 Q! U/ D$ n- n1 {/ @. j
      1,2,3,1,2,5,1,2,4,1,2,3,2;
% H! k  Q; R0 |  F, H9 n$ V      1,2,7,1,2,2,1,2,5,1,2,4,1;1 p; {+ m  N6 [" \& r1 b4 [
      5,2,3,3,5,2,1,2,3,1,2,3,6;8 [- Q+ R) z8 Q  C
      1,2,3,1,2,2,1,6,5,1,2,6,4;  J' b0 G) {/ g0 }" _
      5,2,3,4,4,2,1,2,3,1,2,5,6;3 l- U( n% e& \9 m) c
      1,2,6,1,2,2,1,2,3,1,4,3,2;
$ [% V+ g' n+ n" d( \/ Y8 e' E      1,2,3,4,2,7,1,4,3,1,7,3,3;* t  X2 r# p( L
      5,2,3,5,2,2,1,2,3,1,2,3,4;- g0 i) q  D% b3 r: A
      5,2,4,1,2,2,5,2,3,7,1,6,2;]
0 |, w! f2 q0 |0 a! ]0 u- [
  data2 = [1,2,3,1,2,2,4,2,3,1,2,7,2;- W# G/ g$ r$ m
          1,2,3,6,2,2,1,4,3,1,5,3,1;+ t6 X. p( Q. _8 y5 ^$ z+ a
          1,2,3,1,2,5,1,2,4,1,2,3,2;- z4 [7 P7 S6 T$ k; N* y& f
          1,2,7,1,2,2,1,2,5,1,2,4,1;" V3 z; D6 K; |* i1 W5 M
          5,2,3,3,5,2,1,2,3,1,2,3,6;  f+ m) Z* j1 X3 n8 V
          1,2,3,1,2,2,1,6,5,1,2,6,4;
! \- X. I& P) S. c          5,2,3,4,4,2,1,2,3,1,2,5,6;# Z5 ?+ }0 N) X5 R5 G  h6 ?7 `
          1,2,6,1,2,2,1,2,3,1,4,3,2;
) Q$ [, W8 w- e1 R) `$ U( c/ I" Q          1,2,3,4,2,7,1,4,3,1,7,3,3;! a5 l! z  M6 k, B9 ]$ n0 @& B* b
          5,2,3,5,2,2,1,2,3,1,2,3,4;8 I( ?; h0 }, z/ p* G7 i$ m
          4,2,5,1,2,2,6,2,3,7,1,6,4;]
% initial guess of parameters
& w1 E) E: n( r6 \7 b% 初始化参数
) }5 b- O3 o8 H0 p& Dprior1 = normalise(rand(Q,1));
/ a+ k# |4 J  Q1 @9 M3 L5 Qtransmat1 = mk_stochastic(rand(Q,Q));4 q! y) W1 s- }# g$ N7 ~. a* P; D+ P
obsmat1 = mk_stochastic(rand(Q,O));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
' K7 R& r* Y9 b5 T% `% 添加部分
8 ?" R( ^7 b5 O' b8 N9 I    prior3 = normalise(rand(Q2,1));
! M4 `/ y. @3 Y/ V    transmat3 = mk_stochastic(rand(Q2,Q2));
0 F# O. n$ j2 y% ~# S' u    obsmat3 = mk_stochastic(rand(Q2,O2));
* D* }" f& d. p( S; e% ~$ W%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% improve guess of parameters using EM( ?) @* d+ |9 W$ G6 o  V1 P  e; n1 q
% 用data数据集训练参数矩阵形成新的HMM模型! T2 s# @0 o$ B( P! Y
[LL, prior2, transmat2, obsmat2] = dhmm_em(data, prior1, transmat1, obsmat1, 'max_iter', size(data,1));9 D# V8 M' Y  j% t
% 训练后那行观察值与HMM匹配度5 W: }# {# [& R/ {
LL& f1 ~1 g4 {1 _
% 训练后的初始概率分布
% a4 v4 c0 ~+ z, b! i# N5 D8 Kprior2
& G$ y$ h* K; \" P- Z% 训练后的状态转移概率矩阵/ R0 z0 l! t7 y4 i
transmat25 {# g+ w/ l5 c3 g5 d* }  ]- j' ~
% 观察值概率矩阵, K; `& ]% Q1 \  r. d: F
obsmat2
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 ]# b" _7 Y8 g/ e
% 添加部分& t4 @7 [5 j& A, y
    [LL2, prior4, transmat4, obsmat4] = dhmm_em(data2, prior3, transmat3, obsmat3, 'max_iter', size(data2,1));& I! C* M- \, B' e- M
    LL2
( @2 P* a5 u/ b$ C    prior4: y" T6 Q$ Y- L7 F6 L8 |
    transmat4
8 {+ o6 o2 k0 r% W: {    obsmat4* z; q4 U$ a3 D
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% use model to compute log likelihood8 r9 y1 i8 K* F8 L2 r
% data1=[1,2,3,1,2,2,1,2,3,1,2,3,1]& M# u' [! t$ a" P( C/ Z8 C
data1 = [5,2,4,1,2,2,5,2,3,7,1,6,2]
3 Z" Z* J. H, F0 ?. C. m0 a" ?' Ploglik = dhmm_logprob(data1, prior2, transmat2, obsmat2)$ w6 v! j6 P7 ?; }5 s; P; e
% log lik is slightly different than LL(end), since it is computed after the final M step) Y" D6 `4 `1 I6 b2 s5 j/ _
% loglik 代表着data和这个hmm(三参数为prior2, transmat2, obsmat2)的匹配值,越大说明越匹配,0为极大值。
% path为viterbi算法的结果,即最大概率path
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- n& x; _; W1 y  y4 N; l# q) b% 添加部分" @( y9 U8 _" `: o
loglik2 = dhmm_logprob(data1, prior4, transmat4, obsmat4)
% B4 X' F( b, x; G0 Z/ o$ v%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7 f* m7 A) E3 J- o- f( V
B = multinomial_prob(data1,obsmat2);& Y+ j$ Z# L0 d7 H4 d+ q( {
path = viterbi_path(prior2, transmat2, B)
" `0 i$ K/ G9 v8 N3 _save('sa.mat');

) w3 ^- j- ]' E7 p9 e, f- E- n% d%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%" ^* q6 j0 ~* d( I: H" B+ w
% 添加部分- }* A4 Y; s% R- T$ f5 p
    B2 = multinomial_prob(data1,obsmat4);
; }& Z+ D. r2 k, @" B. K8 h, D    path2 = viterbi_path(prior4, transmat4, B2)& @8 K% f0 i2 t) U( I2 B5 C0 Z
    save('sa2.mat');7 d# e* N/ Q2 p1 e
    if loglik2 > loglik
; R& ~, Z/ ]/ f6 V        fuhe = 2
+ E" t' F; K- ]6 t+ Z    else
, J+ E! j! B/ Y# B4 M        fuhe = 1  l8 ?& {$ q; z, C3 u6 }+ p& B, t
    end   
4 d4 L- w' W4 I8 I4 b: N8 i" _%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
------
运行结果
------
data =
     1     2     3     1     2     2     4     2     3     1     2     7     28 f6 C  [1 a# G5 _
     1     2     3     6     2     2     1     4     3     1     5     3     1
% a4 l0 q# z; m     1     2     3     1     2     5     1     2     4     1     2     3     2. H. w% e% D3 [1 ?+ I& B
     1     2     7     1     2     2     1     2     5     1     2     4     1
) K7 F7 p; [  m& w0 x$ y7 P" c: q     5     2     3     3     5     2     1     2     3     1     2     3     6( O( }' J7 u9 I2 H: I& I# O9 o3 E
     1     2     3     1     2     2     1     6     5     1     2     6     4: v  Z" L% e  }' M  y  y. S/ J0 ?
     5     2     3     4     4     2     1     2     3     1     2     5     6! {, c, M; ^* k6 }, V
     1     2     6     1     2     2     1     2     3     1     4     3     2
- R. [7 T, W) l. T4 B     1     2     3     4     2     7     1     4     3     1     7     3     3
! D4 _& t- `$ `- n) c     5     2     3     5     2     2     1     2     3     1     2     3     4
) _  Y# ^2 ?$ |6 h     5     2     4     1     2     2     5     2     3     7     1     6     2
9 ?6 }/ l* E" V' a4 p
data2 =
     1     2     3     1     2     2     4     2     3     1     2     7     2# _( E  K0 _$ V# R" ]& E/ j& g1 |
     1     2     3     6     2     2     1     4     3     1     5     3     1
' M- A: Y% i  r2 J9 d0 l+ X' y     1     2     3     1     2     5     1     2     4     1     2     3     2
8 E; R) d' l& b- `" L! H( ~     1     2     7     1     2     2     1     2     5     1     2     4     1  U5 f6 }- C% E6 c1 a: P3 V- E& L7 l
     5     2     3     3     5     2     1     2     3     1     2     3     6
) ], Z$ f- s9 [1 M     1     2     3     1     2     2     1     6     5     1     2     6     4
3 t0 A* M4 l+ U* _# G) z8 s     5     2     3     4     4     2     1     2     3     1     2     5     6
! P5 {+ O+ K4 I& ^     1     2     6     1     2     2     1     2     3     1     4     3     2! ?5 A0 w- C; P" ]4 l' ?1 M$ S
     1     2     3     4     2     7     1     4     3     1     7     3     32 I  I+ {, X2 M+ @" t
     5     2     3     5     2     2     1     2     3     1     2     3     4
& w6 x! ]4 w$ S( x# A7 B. B6 d# }     4     2     5     1     2     2     6     2     3     7     1     6     4
iteration 1, loglik = -327.100465% {- G8 ]" F( t2 r% O
iteration 2, loglik = -238.259812" L% c2 Q* c1 s* F) @. S
iteration 3, loglik = -232.962948
2 w4 g) L' O" y& `0 V$ iiteration 4, loglik = -223.3238918 g8 k& A$ i$ l+ m# z* f
iteration 5, loglik = -207.630875
8 `# {/ R8 s; N* ~( A/ u. P8 @3 Niteration 6, loglik = -191.012697
' O% J1 L, ]9 E# witeration 7, loglik = -178.611546, Y) {- r& k, C( h
iteration 8, loglik = -171.524132
8 ]) Q+ g, {7 y8 D% {iteration 9, loglik = -168.626526! J5 U6 Z# [" c% s- ^/ e0 Z4 E
iteration 10, loglik = -167.387057
' G# m! e4 P* G* Viteration 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

& s9 o5 \# G. V( Jprior2 =
    0.0000
! z/ q: d6 x! ?9 y    0.0000$ C+ j0 {' ]% c4 I
    1.0000/ @9 X/ s# i- k# f
    0.00004 ?7 I( y& O! D
    0.0000
$ L# ^5 \, t) s
transmat2 =
    0.0138    0.0089    0.7680    0.1060    0.10334 L% V) G  ~% t# E: i; x4 p
    0.7811    0.0000    0.0199    0.0067    0.1923
/ N- I- S0 Z1 v+ j; f. I, t    0.0000    0.9936    0.0000    0.0064    0.00006 k/ z+ d9 t0 J! j* F' o7 e+ [+ R
    0.1686    0.2604    0.2242    0.3398    0.0070" t/ x3 s: U+ g' @
    0.0053    0.0406    0.8350    0.1184    0.0007

4 K. }9 H$ t1 `! f  Fobsmat2 =
    0.0000    0.2351    0.5738    0.0256    0.1118    0.0186    0.0351
% a8 X% ?6 j* n! }0 h% t& h    0.0000    0.8270    0.0000    0.0790    0.0256    0.0456    0.02285 [9 m! Z2 E9 F* R6 a& ~
    0.7514    0.0021    0.0011    0.0550    0.1472    0.0432    0.00005 X5 D  `5 b& u0 J1 b0 v* [
    0.0014    0.4208    0.0447    0.4366    0.0023    0.0887    0.0055
' s0 z/ b/ k3 o% c4 q    0.0000    0.0784    0.3223    0.2014    0.0116    0.1525    0.2338
iteration 1, loglik = -277.738670
! S* A: P' K% |$ j, K* X+ {iteration 2, loglik = -242.163247/ d  C* z, J: m8 d/ I4 T0 c
iteration 3, loglik = -238.321971  [/ r% G/ m- W& w# n
iteration 4, loglik = -233.166746
( Q: t0 @" b5 o1 J4 \* \; U. ?iteration 5, loglik = -225.682259
3 u9 L* D5 n4 z% q. o4 u! }: {iteration 6, loglik = -214.560296
& I3 G8 L: l: i. Qiteration 7, loglik = -201.182015
* j1 F4 O/ A- J- kiteration 8, loglik = -189.427453- Q3 w5 c) p' ?$ l) u# q
iteration 9, loglik = -179.156352- `* e' A' ?9 f8 R; l) g: C& _
iteration 10, loglik = -171.744096
( @% S, w2 h. d( L* N4 k3 J' ]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 e! j; u7 Z+ g* i& N! yprior4 =
    0.0000& b# U1 P1 ]. j. ]# a0 m5 y( t
    0.9982$ t! a4 k& S4 K
    0.0004$ j4 H% x$ k0 l& o9 E! d
    0.0014
7 x# m3 m9 R1 O$ q, m    0.0000

' @' N% d- n( vtransmat4 =
    0.0873    0.5277    0.2799    0.1007    0.0045  m3 [* S" c" D) d' x: K: E
    0.0002    0.0000    0.0005    0.0000    0.9994
4 a* I) n: _& T, t6 J  P    0.0180    0.0000    0.0118    0.0011    0.9692
/ t" {5 F: ?- }' h    0.0436    0.0226    0.0810    0.0219    0.8310% @$ t$ D$ h5 G1 v
    0.9746    0.0056    0.0003    0.0195    0.0000

% y5 m- W2 {$ p: T8 a% xobsmat4 =
    0.0000    0.2012    0.5080    0.0580    0.1093    0.0465    0.0770
. q% N( O8 d) c# h1 e% F; s    0.7939    0.0001    0.0000    0.0745    0.1277    0.0038    0.0000
( V* ^, X) }1 k4 n) C    0.4120    0.1044    0.0049    0.1736    0.0032    0.3017    0.0001
  m; o' l4 G1 K5 R& U    0.4527    0.0622    0.0637    0.2568    0.0549    0.0295    0.0802
5 L. M, Q. h+ E9 l3 p    0.0000    0.8172    0.0000    0.0943    0.0270    0.0389    0.0225
; Z& T' }! j% E3 s2 X
data1 =
     5     2     4     1     2     2     5     2     3     7     1     6     2
) a) D& S1 [8 M# o$ ~
loglik =
  -19.2351

6 G/ R. a4 b1 z; \, p) ?loglik2 =
  -21.0715

. m3 s% ^! f# V% `7 X0 \: ~path =
     3     2     5     3     2     1     3     2     1     5     3     2     1
$ `8 g8 R$ w% j: t% x8 }
path2 =
     2     5     1     2     5     1     2     5     1     1     2     5     1
7 u- U) G8 m5 j9 ?1 R4 n
fuhe =
     1

. P* I7 o4 t  m+ n; d8 {  ^9 b. R3 k: C$ t3 M$ j

6 ]( ?7 H& X/ L' A& R

HMM工具箱.rar

399.79 KB, 下载次数: 0, 下载积分: 体力 -2 点

售价: 5 点体力  [记录]  [购买]






欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5