隐马尔科夫模型

209 阅读2分钟

前言

本文已参与「新人创作礼」活动,一起开启掘金创作之路。隐马尔科夫模型(HMM)是一个非常常见的概率模型,可能不少同学都有听说过甚至学过,隐马尔科夫模型在图像识别,自然语言处理方面都有很广泛的应用。

正文

本文介绍一下隐马尔科夫模型中的基本算法,前向算法喝后向算法,基于matlab实现:

前向算法—后项算法
function [alpha,betta,p1,p2] = ForwardBackward(A,B,PI,O)
%前向算法和后向算法
A_size=size(A);
N=A_size(1,1);%状态集合(隐藏状态的个数)Q包含的元素个数
O_size=size(O);
T=O_size(1,1);%观测序列和观测序列对应的状态序列的长度
%%赋值
alpha=zeros(T,N);
%%---------前向算法初始化-------------
%%alpha(1,i)=PI(i)*B(i,1)
for i=1:N
    alpha(1,i)=PI(i)*B(i,1);
end
%%--------前向算法递推--------------
%%alpha_t+1_i=sum(from_j=1_to_N alpha_t_j*A_j_i)*B(i,O(t+1,1))
for t=1:T-1
    alpha(t+1,:)=alpha(t,:)*A.*B(:,O(t+1,1))';
end
%%--------前向算法终止------------
%%计算观测序列的概率
p1=0;
for i=1:N
    p1=p1+alpha(T,i);
end
betta=zeros(T,N);
%%---------后向算法赋初值---------
for i=1:N
    betta(T,i)=1;
end
%%--------后向算法递推-----------
%%betta(t,i)=sum(from_j=1_to_j=N_A(i,j)*B(O(t+1,1),j)*betta(t+1,j))
for t=T-1:-1:1
    betta(t,:)=betta(t+1,:).*B(:,O(t+1,1))'*A';
end
%%为了方便起见,我把递推的计算过程用矩阵运算表示出来了
%%-------后向算法终止-------------
%%计算观测序列的概率
p2=0;
for i=1:N
    p2=p2+PI(i)*B(i,O(1,1))*betta(1,1);
end
end
gamma 和cauthy的计算过程
function [Gama,Xi] = GamaXi(A,B,PI,O)
%计算Gama和Xi
%调用函数ForwardBackward,计算出所需要的参数 alpha,betta,p1,p2
[alpha,betta,p1,p2]=ForwardBackward(A,B,PI,O);
%%____________计算Gama__________
A_size=size(A);
O_size=size(O);
T=O_size(1,1);
N=A_size(1,1);
%%Gama初始化
Gama=zeros(T,N);
%%Gama=(alpha_ti*betta_ti)/p1,其中p1为观测序列的概率
for t=1:T
    for i=1:N
        Gama(t,i)=(alpha(t,i)*betta(t,i))/p1;
    end
end
%%________________计算Xi_____________________
%%因为Cauthy有三个下标,为了方便起见,我们把Cauthy设为三维矩阵
%%Xi(i,j,t)=alpha(t,i)*A(i,j)*B(j,O(t+1,1))*betta( b)
Xi=zeros(N,N,T-1);
for t=1:T-1
    for i=1:N
        for j=1:N
            Xi(i,j,t)=(alpha(t,i)*A(i,j)*B(j,O(t+1,1))*betta(t+1,j))/p2;
        end
    end
end
end

再见