前言
本文已参与「新人创作礼」活动,一起开启掘金创作之路。上一次介绍了隐马尔科夫模型中的前向和后向算法,本文主要介绍隐马尔科夫模型中的参数学习算法,这也是隐马尔科夫模型中最为复杂的一个问题。主要还是基于matlab实现。
代码
鲍姆韦尔奇算法主要是对隐马尔科夫模型中的观测矩阵,概率转移矩阵,初始概率分布进行估计。
鲍姆韦尔奇算法
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
结尾
由于时间紧迫,在这里不对算法的具体过程进行介绍,有兴趣大家可以看李航的统计学习,里面讲的很清楚,这里仅提供现成的matlab代码供大家参考。有时对算法进行总结,将一些运算写成矩阵的形式,会更简便。