clc;
clear all;
close all;

Start_Pi = [-1,-1];
State_k = ['H','L'];
% 转移矩阵
Transition_matrix = [-1,-1.322;-1.322,-0.737];
% 0 H L
% H -1 -1
% L -1.322,-0.373
% 序列中包含字母ACTG
sequence = ['A','C','G','T'];
Emission_matrix = [-2.322,-1.737,-1.737,-2.322;
-1.737,-2.322,-2.322,-1.737];
Observation_sequence = ['G','G','C','A','C','T','G','A','A'];
k = length(State_k);
l = length(Observation_sequence);
Result_matrix = zeros(k + 1,l + 1);
Result_matrix(1,2:l+1) = Observation_sequence;
Result_matrix(2:k+1,1) = State_k ;
%% Viterbi algorithm(这里是用权值代替概率计算的)
Result_matrix(2,2) = Start_Pi(1) + Emission_matrix(1,find(sequence ...
== Observation_sequence(1),1));
Result_matrix(3,2) = Start_Pi(2) + Emission_matrix(2,find(sequence ...
== Observation_sequence(1),1));
for i = 3 : l + 1
for j = 2: k+1
if j ~= k + 1
Result_matrix(j,i) = Emission_matrix(j - 1,find(sequence == Observation_sequence(i - 1),1)) +...
max(Result_matrix(j,i - 1) + Transition_matrix(j - 1,1),Result_matrix(j + 1,i - 1) + Transition_matrix(j,1) );
else
Result_matrix(j,i) = Emission_matrix(j - 1,find(sequence == Observation_sequence(i - 1),1)) +...
max(Result_matrix(j -1,i - 1) + Transition_matrix(j - 2,2),Result_matrix(j ,i - 1) + Transition_matrix(j - 1,2) );
end
end
end
%% back tracing
Result = max(Result_matrix(2:k+1,l+1));
[row,~ ]= find(Result_matrix == Result);
State_sequence = [];
State_sequence= strcat(State_k(row-1));
for i = l : -1: 3
if row == k+ 1
if Result == Result_matrix(row,i ) + Transition_matrix(row - 1,2) +...
Emission_matrix(row - 1,find(sequence == Observation_sequence(i),1))
State_sequence = strcat(State_k(2),State_sequence);
Result = Result_matrix(row,i );
else
State_sequence =strcat(State_k(1),State_sequence);
row = row -1;
Result = Result_matrix(row,i );
end
elseif row == 2
if Result == Result_matrix(row,i ) + Transition_matrix(row - 1,1) + ...
Emission_matrix(row - 1,find(sequence == Observation_sequence(i),1));
State_sequence=strcat(State_k(1),State_sequence);
Result = Result_matrix(row,i );
else
State_sequence=strcat(State_k(2),State_sequence);
row = row + 1;
Result = Result_matrix(row,i );
end
else
break;% 因为例子只有两个状态,其他就没有写
end
end
%% 输出序列头部处理
tem = max(Result_matrix(2:3,2));
[r,~] = find(Result_matrix == tem);
State_sequence= strcat(State_k(r-1),State_sequence);
disp(State_sequence)

Viterbi算法的更多相关文章

  1. HMM Viterbi算法 详解

    HMM:隐式马尔可夫链   HMM的典型介绍就是这个模型是一个五元组: 观测序列(observations):实际观测到的现象序列 隐含状态(states):所有的可能的隐含状态 初始概率(start ...

  2. 隐马尔可夫模型(HMM)及Viterbi算法

    HMM简介   对于算法爱好者来说,隐马尔可夫模型的大名那是如雷贯耳.那么,这个模型到底长什么样?具体的原理又是什么呢?有什么具体的应用场景呢?本文将会解答这些疑惑.   本文将通过具体形象的例子来引 ...

  3. 隐马尔可夫(HMM)、前/后向算法、Viterbi算法

    HMM的模型  图1 如上图所示,白色那一行描述由一个隐藏的马尔科夫链生成不可观测的状态随机序列,蓝紫色那一行是各个状态生成可观测的随机序列 话说,上面也是个贝叶斯网络,而贝叶斯网络中有这么一种,如下 ...

  4. ZH奶酪:隐马尔可夫模型学习小记——forward算法+viterbi算法+forward-backward算法(Baum-welch算法)

    网上关于HMM的学习资料.博客有很多,基本都是左边摘抄一点,右边摘抄一点,这里一个图,那里一个图,公式中有的变量说不清道不明,学起来很费劲. 经过浏览几篇博文(其实有的地方写的也比较乱),在7张4开的 ...

  5. Viterbi算法和隐马尔可夫模型(HMM)算法

    隐马尔可夫模型(HMM)及Viterbi算法 https://www.cnblogs.com/jclian91/p/9954878.html HMM简介   对于算法爱好者来说,隐马尔可夫模型的大名那 ...

  6. 隐马尔可夫模型(HMM)及Viterbi算法

    HMM简介 对于算法爱好者来说,隐马尔可夫模型的大名那是如雷贯耳.那么,这个模型到底长什么样?具体的原理又是什么呢?有什么具体的应用场景呢?本文将会解答这些疑惑. 本文将通过具体形象的例子来引入该模型 ...

  7. 隐马尔可夫模型及Viterbi算法

    隐马尔可夫模型(HMM,hidden Markov model)是可用于标注问题的统计学模型,描述由隐藏的马尔可夫链随机生成观测序列的过程,属于生成模型.HMM模型主要用于语音识别,自然语言处理,生物 ...

  8. 基于Noisy Channel Model和Viterbi算法的词性标注问题

    给定一个英文语料库,里面有很多句子,已经做好了分词,/前面的是词,后面的表示该词的词性并且每句话由句号分隔,如下图所示 对于一个句子S,句子中每个词语\(w_i\)标注了对应的词性\(z_i\).现在 ...

  9. Viterbi 算法 Python实现 [NLP学习一]

    最近思考了一下未来,结合老师的意见,还是决定挑一个方向开始研究了,虽然个人更喜欢鼓捣.深思熟虑后,结合自己的兴趣点,选择了NLP方向,感觉比纯粹的人工智能.大数据之类的方向有趣多了,个人还是不适合纯粹 ...

  10. 隐马尔科夫模型及Viterbi算法的应用

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4335810.html 一个例子: 韦小宝使用骰子进行游戏,他有两种骰子一种正常的骰子,还有一 ...

随机推荐

  1. python接口测试3-JSON格式

    什么是JSON? 一种轻量级的数据交换格式.它独立于语言和平台,JSON解析器和JSON库支持不同的编程语言.JSON具有自我描述性,很容易理解. 数据格式: { "name":& ...

  2. acm 易错警示

    1:建图注意是有向图还是无向图,无向开两倍数组 2:看题注意是否为多组输入,多组输入注意初始化. 3:减法取模一定要注意 4:stl中.size()为unsigned如果要计算注意强制类型转换(int ...

  3. JQuery案例:购物车编辑

    购物车编辑 实现了:商品的加减,总价的变动 实现了:全选/全不选(使用prop而不是attr) 实现了:删除(遮罩层) <html> <head> <meta chars ...

  4. .NetCore项目Linux部署总结

    Linux部署文档 1.常用指令 find [/根目录 .当前目录] -name [文件名]  --查找文件路径ps aux | grep [程序名] --查询查询启动状态ps -ef | grep ...

  5. LeetCode 767. 重构字符串

    给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同. 若可行,输出任意可行的结果.若不可行,返回空字符串. 示例 1: 输入: S = "aab"输出: &quo ...

  6. guava中的SettableFuture分析

    当缓存中没有要找的数据时,则要从数据库中去查询,而当并发量比较大时可能会击穿数据库,所以guava cache对同一值的查询做了合并请求的处理.其中就用到了SettableFuture,类似一把锁,只 ...

  7. Django的静态文件的配置

    静态文件配置 STATIC_URL = '/static/' # 静态文件配置 STATICFILES_DIRS = [ os.path.join(BASE_DIR,'static') ] # 暴露给 ...

  8. Linux之centos包管理【rpm】、【yum】、【tar】

    rpm包是二进制格式,无需编译安装便可使用,tar包是源码格式,需要编译安装才可使用 rpm包管理: rpm:redhat package manager,红帽的包管理器,其主要的操作参数有如下: - ...

  9. activiti笔记

    activiti笔记 核心api api介绍 1.ProcessEngine 说明: 1) 在Activiti中最核心的类,其他的类都是由他而来. 2) 产生方式: ProcessEngine pro ...

  10. 老猿学5G扫盲贴:N6接口用户平面协议栈对应的网络分层模型

    在网络通信模型中,都对应有分层的网络结构,如开放式系统互联(OSI)的七层模型(物理层.数据链路层.网络层.传输层.会话层.表示层和应用层)以及TCP/IP四层(网络接口层.网络层.传输层和应用层)模 ...