HMM算法

来源:互联网 发布:抄板软件quickpcb 编辑:程序博客网 时间:2024/06/07 00:05

HMM算法


算法描述

  1. Generating Patterns
    Generating Patterns包括determination pattern和non- determiniation pattern 两种 ,在non-determiniation中,我们假设当下的状态仅与前k个状态有关,这种假设下得到的模型也就是K阶马尔科夫模型。当k=1时,得到1阶马尔科夫模型。
    一阶马氏模型有以下三个要素:

    • 状态
    • PI向量:系统初始化每个状态的概率
    • 状态转移矩阵(该矩阵在系统生命周期内保持不变)
  2. Hidden Patterns
    观察的状态->(隐藏的状态)->结果
    引入:Hidden Markov Models

建模过程

参数:三元组(PI,A,B)
PI:初始向量
A:转移矩阵
B:观测矩阵(或者混淆矩阵):包含了观察的状态与隐藏状态的关系
前向后向算法
input:Markov Model λ=(A,B,π),观察序列O
output:观测序列概率P(O|λ)
需要的公式:(i=1,2,.....N)
α1(i)=πibi(o1)
αt+1(i)=[Nj=1αt(j)aji]bi(ot+1)
βT(i)=1
βt(i)=Nj+1aijbj(ot+1)βt+1(j)
P(O|λ)=Ni=1Nj=1αt(i)aijbj(ot+1)βt+1(j)
备注:这里的αt(i)定义为前向概率

αt(i)=P(o1,o2,...ot,it=qi|λ)

这里的βt(i)定义为后向概率
βt(i)=P(ot+1,ot+2,...,oT|it=qi,λ

维特比算法
思想:用动态规划(dynamic programming)求概率最大路径(最优路径)
input:Markov Model λ=(A,B,π),观察序列O
output:最优路径I
解法:
STEP1:
δ1(i)=πibi(o1)
ψ1(i)=0
STEP2:
δt(i)=max1jN[δt1aji]bi(ot)
ψt(i)=argmax[δt1(j)aji]
STEP3:
P=maxδT(i)
iT=argmax[δT(i)]
STEP4:最优路径回溯
it=ψt+1(tt+1)
得到最优路径:I=(i1,i2,...,iT)


注意到δα的算法是很相似的,不同在于前者是取最大值,后者是求和。
代码编写(MATLAB)
主函数

%forward algotithmclc%===============data===================A=[0.5,0.2,0.3;0.3,0.5,0.2;0.2,0.3,0.5];B=[0.5,0.5;0.4,0.6;0.7,0.3];PI=[0.2,0.4,0.4];Q=[1,2,3];T=4;%[~,T]=size(O)O=[1,2,1,2];%======forward algorithm method========alpha=[];%calculate initial value[~,num]=size(Q);for i=1:numalpha(i)=PI(i)*B(i,O(1));endalpha%recursivefor k=2:Talpha=recursive(alpha,A,B,O(k),num)end%prob=0;for i=1:num    prob=prob+alpha(i);endprob%======back algorithm method==============beta=ones(1,num)for k=0:T-2    beta=recursive1(beta,A,B,O(T-k),num);endprob=0;for i=1:num    prob=prob+PI(i)*B(i,O(1))*beta(i);endprob%==========viterbi==========================viter=zeros(T,num);for i=1:numviter(1,i)=PI(i)*B(i,O(1));endviter%recursiveflag=2;path=zeros(T,num);for i=1:num    path(1,i)=i;endfor k=2:T[viter(k,:),path(flag,:)]=viterbi(viter(k-1,:),A,B,O(k),num)flag=flag+1;end

function [outputarray]=recursive(inputarray,A,B,position,num)outputarray=[];for i=1:num    sum=0;    for j=1:num        sum=sum+inputarray(j)*A(j,i);    end    outputarray(i)=B(i,position)*sum;end

function [outputarray]=recursive1(inputarray,A,B,position,num)outputarray=[];for i=1:numsum=0;for j=1:numsum=sum+A(i,j)*B(j,position)*inputarray(j);end outputarray(i)=sum;end

function [outputarray,path]=viterbi(inputarray,A,B,position,num)outputarray=[];path=[];for i=1:num    for j=1:num        temp(j)=inputarray(j)*A(j,i);    end    outputarray(i)=B(i,position)*max(temp);    path(i)=find(temp==max(temp));end

结果输出

alpha =

0.1000    0.1600    0.2800

alpha =

0.0770    0.1104    0.0606

alpha =

0.0419    0.0355    0.0528

alpha =

0.0211    0.0252    0.0138

prob =

0.0601

prob =

0.0601

viter =

0.1000    0.1600    0.28000.0280    0.0504    0.04200.0076    0.0101    0.01470.0019    0.0030    0.0022

path =

 1     2     3 3     3     3 2     2     3 1     2     3
0 0
原创粉丝点击