隐马尔可夫模型(HMM)的MATLAB实现——Viterbi算法

维特比算法实际是用动态规划求解隐马尔可夫模型解码问题,即用动态规划求概率最大路径(最优路径)。代码中有示例,来自李航《统计学习方法》

function [Delta,Psi,P,I] = Viterbi(A,B,Pi,O)
% 函数功能:利用维特比算法找到观测序列O的最优路径
%
% 参考文献:李航《统计学习方法》
%
% 思路:
% 1,初始化
%    delta_1(i) = Pi_i * b_i(o1),   i = 1,2,...,N
%    psi_1(i) = o,  i = 1,2,...,N
% 2,递推,对于t = 2,3,...,T
%    delta_t(i) = max_1-from-1-to-N(delta_t-1(j) * a_ji) * b_i(ot),   i = 1,2,...,N
%    psi_t(i) = arg max_1-from-1-to-N(delta_t-1(j) * a_ji),   i = 1,2,...,N
% 3,终止
%    最优路径概率P* = max_1-from-1-to-N(delta_T(i))
%    最优路径终点i*_T = arg max_1-from-1-to-N(delta_T(i))
% 4,最优路径回溯,对于t = T-1,T-2,...,1
%    i*_t = psi_t+1(i*_t+1)
%    最优路径I* = (i*_1,i*_2,...,i*_T)
% 【提示:“思路”中的i,j和本程序中的i,j不存在对应关系,只是方便理解原理】
% 
% 输入:模型参数A,B,Pi,观测序列O
% 输出:Delta矩阵:在时刻t状态为i的所有单个路径中概率最大值构成的矩阵,
%         为N*K阶,即行数表示状态数,列数表示时刻。
%       Psi矩阵:在时刻t状态为i的所有单个路径中概率最大路径的第t-1个结点构成的矩阵,
%         为N*K阶,即行数表示状态数,列数表示时刻。且第一列为0。
%       P:观测序列O的最优路径概率。
%       I:观测序列O的最优路径。
%         
% 示例:(李航《统计学习方法》P186例10.3)
% 输入
% A =
%     0.5000    0.2000    0.3000
%     0.3000    0.5000    0.2000
%     0.2000    0.3000    0.5000
% B =
%     0.5000    0.5000
%     0.4000    0.6000
%     0.7000    0.3000
% Pi =
%     0.2000
%     0.4000
%     0.4000
% O1 =
%      1
%      2
%      1
% 输出:
% >>[D,Psi,P,I] = Viterbi(A,B,Pi,O1)
% D =
%     0.1000    0.0280    0.0076
%     0.1600    0.0504    0.0101
%     0.2800    0.0420    0.0147
% Psi =
%      0     3     2
%      0     3     2
%      0     3     3
% P =
%     0.0147
% I =
%      3
%      3
%      3

A_size = size(A);
O_size = size(O);
N = A_size(1,1);%状态集个数
M = A_size(1,2);
K = O_size(1,1);

% 计算Delta矩阵第一列值
Delta = zeros();
for i = 1:M
    Delta(i,1) = Pi(i) * B(i,O(1,1));
end

% 递推计算Delta矩阵剩下值
Delta_j = zeros();
Psi = zeros();
Psi(:,1) = 0;
for t = 2:K
    for j = 1:N
        for i = 1:M
            Delta_j(i,1) = Delta(i,t-1) * A(i,j) * B(j,O(t,1));
        end
        [max_delta_j,psi] = max(Delta_j); %找到概率最大值
        Psi(j,t) = psi; %放置Psi矩阵
        Delta(j,t) = max_delta_j; %放置Delta矩阵
    end
end

[P_better,psi_k] = max(Delta(:,K));
P = P_better; % 最优路径概率
I = zeros();
I(K,1) = psi_k;
for t = K-1:-1:1
    I(t,1) = Psi(I(t+1,1),t+1); %路径回溯得到最优路径
end


  • 14
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
大学生参加学科竞赛有着诸多好处,不仅有助于个人综合素质的提升,还能为未来职业发展奠定良好基础。以下是一些分析: 首先,学科竞赛是提高专业知识和技能水平的有效途径。通过参与竞赛,学生不仅能够深入学习相关专业知识,还能够接触到最新的科研成果和技术发展趋势。这有助于拓展学生的学科视野,使其对专业领域有更深刻的理解。在竞赛过程中,学生通常需要解决实际问题,这锻炼了他们独立思考和解决问题的能力。 其次,学科竞赛培养了学生的团队合作精神。许多竞赛项目需要团队协作来完成,这促使学生学会有效地与他人合作、协调分工。在团队合作中,学生们能够学到如何有效沟通、共同制定目标和分工合作,这对于日后进入职场具有重要意义。 此外,学科竞赛是提高学生综合能力的一种途径。竞赛项目通常会涉及到理论知识、实际操作和创新思维等多个方面,要求参赛者具备全面的素质。在竞赛过程中,学生不仅需要展现自己的专业知识,还需要具备创新意识和解决问题的能力。这种全面的综合能力培养对于未来从事各类职业都具有积极作用。 此外,学科竞赛可以为学生提供展示自我、树立信心的机会。通过比赛的舞台,学生有机会展现自己在专业领域的优势,得到他人的认可和赞誉。这对于培养学生的自信心和自我价值感非常重要,有助于他们更加积极主动地投入学习和未来的职业生涯。 最后,学科竞赛对于个人职业发展具有积极的助推作用。在竞赛中脱颖而出的学生通常能够引起企业、研究机构等用人单位的关注。获得竞赛奖项不仅可以作为个人履历的亮点,还可以为进入理想的工作岗位提供有力的支持。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值