隐马尔可夫模型三大基本问题完整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-11
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
鲍姆韦尔奇算法
function [A_1,B_1,PI_1] = BaumWelch(A,B,PI,O)
A_size=size(A);
O_size=size(O);
B_size=size(B);
M=B_size(1,2);%观测集中元素的个数,即V中元素的个数
N=A_size(1,1);%隐藏状态集元素的个数,即Q中元素的个数
T=O_size(1,1);%观测序列的长度。
%鲍姆韦尔奇算法对参数进行估计
%%更新参数PI(i)____
%%公式:PI(i)=Gama(1,i)
[Gama,Xi]=GamaXi(A,B,PI,O);
PI_1=zeros(T,1);
for i=1:N
PI_1(i)=Gama(1,i);
end
%%更新参数A(i,j)_____
%计算Gamma的每一行之和,表示在观测时间序列的所有时刻都处于某一个状态的概率和
f = sum(Gama,1);
A_1=zeros(N);
for i = 1:N
for j = 1:N
A_1(i,j) = sum(Xi(i,j,:))/ (f(1,i) - Gama(T,i));
end
end

%%更新参数B(i,j)__
B_1=zeros(N,M);
c=0;
G=[];
for m = 1:M
for j = 1:N
for t = 1:T
if O(t,1) == m % 用于比较输出的观测值是否由对应的状态值输出,即条件ot = vk;
c = c + 1;
G(c,1) = Gama(j,t);
end
end
B_1(j,m) = sum(G) / f(1,j);
c = 0;
G = zeros();
end
end
end
维特比算法
function [ I_star,sigma,cauthy] =Viterbi(A,B,PI,O)
%维特比算法
%参数初始化
A_size=size(A);
O_size=size(O);
N=A_size(1,1);
T=O_size(1,1);
sigma=zeros(T,N);
cauthy=zeros(T,N);
%%初始化
__
for i=1:N
sigma(1,i)=PI(i)*B(i,O(1,1));
cauthy(1,i)=0;
end
%%递推________
for t=2:T
for i=1:N
[max_num,max_index]=max(sigma(t-1,:).A(:,i)’);
sigma(t,i)=max_num
B(i,O(t,1));
cauthy(t,i)=max_index;
end
end
%%终止_______
I_star=zeros(1,T);
[P_star,I_star(1,T)]=max(sigma(T,:));
%%最优路径回溯_____
for t=T-11
I_star(1,t)=cauthy(t+1,I_star(1,t+1));
end

end

你可能感兴趣的:(笔记)