隐马尔科夫模型(3)--维特比算法

337 阅读2分钟

前言

本文已参与「新人创作礼」活动,一起开启掘金创作之路。本文今天介绍隐马尔科夫模型三大基本问题中的最后一个问题——预测问题中的viterbi算法。维特比算法是一种动态规划算法用于寻找最有可能产生观测事件序列的-维特比路径-隐含状态序列,特别是在马尔可夫信息源上下文和隐马尔可夫模型中。术语“维特比路径”和“维特比算法”也被用于寻找观察结果最有可能解释相关的动态规划算法。例如在统计句法分析中动态规划算法可以被用于发现最可能的上下文无关的派生(解析)的字符串,有时被称为“维特比分析”。还是基于matlab进行实现

matlab代码

维特比算法
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-1:-1:1
    I_star(1,t)=cauthy(t+1,I_star(1,t+1));
end

end

结合前面所介绍的前向后向算法以及鲍姆韦尔奇算法,便可以构建一个简单的预测模型。

结语

维特比算法由安德鲁·维特比(Andrew Viterbi)于1967年提出,用于在数字通信链路中解卷积以消除噪音。 此算法被广泛应用于CDMAGSM数字蜂窝网络、拨号调制解调器、卫星、深空通信和802.11无线网络中解卷积码。现今也被常常用于语音识别、关键字识别、计算语言学和生物信息学中。例如在语音(语音识别)中,声音信号作为观察到的事件序列,而文本字符串,被看作是隐含的产生声音信号的原因,因此可对声音信号应用维特比算法寻找最有可能的文本字符串