1、隐马尔可夫模型HMM
   学习算法,看中文不如看英文,中文喜欢描述的很高深。
   http://www.comp.leeds.ac.uk/roger/HiddenMarkovModels/html_dev/main.html
   里面有HMM定义、前向算法、维特比算法、后向算法。

2、Viterbi是隐马尔科夫模型中用于确定(搜索)已知观察序列在HMM下最可能的隐藏序列。
   Viterb采用了动态规划的思想,利用后向指针递归地计算到达当前状态路径中的最可能(局部最优)路径。
   要理解,看wiki的一个动态图。
   https://en.wikipedia.org/wiki/File:Viterbi_animated_demo.gif
   求解最可能的隐状态序列是HMM的三个典型问题之一,通常用维特比算法解决。
   维特比算法就是求解HMM上的最短路径(-log(prob),也即是最大概率)的算法。

3、HMM五元组
   1)obs:观测序列,m个;
   2)states:隐状态,n个;
   3)start_p:初始概率(隐状态)
   4)trans_p:转移概率(隐状态),n*n矩阵,描述时间序列上的隐状态概率;
   5)emit_p: 发射概率 (隐状态表现为显状态的概率),n*m矩阵;
   要理解HMM模型的基本定义和三个基本问题。

4、Viterbi算法简单实现:
   https://github.com/hankcs/Viterbi/tree/master/src/com/hankcs/algorithm

算法本身理解是一回事,着手代码又是一回事,所以对于能够代码动手实现的,是很值得学习的,至少表明其深入理解了。

算法中的思路是从观测的序列得到最大概率的隐状态,关键就是这一时刻的隐状态能得出下一个时刻隐状态的概率以及这一时刻显状态的概率。

package sk.ml;/*** 维特比算法*/
public class Viterbi {/*** 求解HMM模型* @param obs 观测序列* @param states 隐状态* @param start_p 初始概率(隐状态)* @param trans_p 转移概率(隐状态)* @param emit_p 发射概率 (隐状态表现为显状态的概率)* @return 最可能的序列*/public static int[] compute(int[] obs, int[] states, double[] start_p, double[][] trans_p, double[][] emit_p){double[][] V = new double[obs.length][states.length];int[][] path = new int[states.length][obs.length];for (int y : states){V[0][y] = start_p[y] * emit_p[y][obs[0]];path[y][0] = y;}for (int t = 1; t < obs.length; ++t){int[][] newpath = new int[states.length][obs.length];for (int y : states){double prob = -1;int state;for (int y0 : states){double nprob = V[t - 1][y0] * trans_p[y0][y] * emit_p[y][obs[t]];if (nprob > prob){prob = nprob;state = y0;// 记录最大概率V[t][y] = prob;// 记录路径System.arraycopy(path[state], 0, newpath[y], 0, t);newpath[y][t] = y;}}}path = newpath;}double prob = -1;int state = 0;for (int y : states){if (V[obs.length - 1][y] > prob){prob = V[obs.length - 1][y];state = y;}}return path[state];}
}

5、网络上对HMM有两个比较经典的案例,一个是天气,一个是诊断。

诊断见知乎上文章:https://www.zhihu.com/question/20136144

package sk.ml;import static sk.ml.DoctorExample.Status.*;
import static sk.ml.DoctorExample.Feel.*;public class DoctorExample {enum Status{Healthy,//健康Fever,//感冒}enum Feel{normal,//舒服cold,//冷dizzy,//头晕}static int[] states = new int[]{Healthy.ordinal(), Fever.ordinal()};static int[] observations = new int[]{normal.ordinal(), cold.ordinal(), dizzy.ordinal()};static double[] start_probability = new double[]{0.6, 0.4};static double[][] transititon_probability = new double[][]{{0.7, 0.3},{0.4, 0.6},};static double[][] emission_probability = new double[][]{{0.5, 0.4, 0.1},{0.1, 0.3, 0.6},};public static void main(String[] args){int[] result = Viterbi.compute(observations, states, start_probability, transititon_probability, emission_probability);for (int r : result){System.out.print(Status.values()[r] + " ");}System.out.println();}
}

执行结果:

Healthy Healthy Fever 

天气见这里面的例子:http://www.comp.leeds.ac.uk/roger/HiddenMarkovModels/html_dev/main.html

package sk.ml;import static sk.ml.WeatherExample.Weather.*;
import static sk.ml.WeatherExample.Activity.*;
public class WeatherExample {enum Weather//隐状态{Rainy,//下雨Sunny,//天晴}enum Activity //显状态{walk,//散步shop,//购物clean,//清洁}static int[] states = new int[]{Rainy.ordinal(), Sunny.ordinal()};static int[] observations = new int[]{walk.ordinal(), shop.ordinal(), clean.ordinal()};static double[] start_probability = new double[]{0.6, 0.4};//初始状态static double[][] transititon_probability = new double[][]{//转移矩阵{0.7, 0.3},{0.4, 0.6},};static double[][] emission_probability = new double[][]{//观测矩阵{0.1, 0.4, 0.5},{0.6, 0.3, 0.1},};public static void main(String[] args){int[] result = Viterbi.compute(observations, states, start_probability, transititon_probability, emission_probability);for (int r : result){System.out.print(Weather.values()[r] + " ");}System.out.println();}
}

执行结果:

Sunny Rainy Rainy 

理解算法最好的就是代码和数学公式两边对应。

机器学习知识点(二十四)隐马尔可夫模型HMM维特比Viterbi算法Java实现相关推荐

  1. 人工智能里的数学修炼 | 隐马尔可夫模型 : 维特比(Viterbi)算法解码隐藏状态序列

    人工智能里的数学修炼 | 概率图模型 : 隐马尔可夫模型 人工智能里的数学修炼 | 隐马尔可夫模型:前向后向算法 人工智能里的数学修炼 | 隐马尔可夫模型 : 维特比(Viterbi)算法解码隐藏状态 ...

  2. 隐马尔科夫模型(HMM)的无监督学习算法java实现(baum-welch迭代求解),包括串行以及并行实现

    HMM的原理就不说了,这里主要说算法的实现. 实际实现起来并不是很困难,前提是你仔细看过hmm的原理,然后很多实现就照着公式写出对应的代码,比如前向算法,后向算法,参数更新都是有明确的公式的,只需要对 ...

  3. 隐马尔可夫模型HMM+维特比算法(Viterbi Algorithm)进行词性标注代码实现(自然语言处理课程第二次作业)

    文章目录 一.理论描述 二.算法描述 三.详例描述 具体过程 分析题目 数据预处理 转移概率矩阵: 发射概率矩阵: HMM+维特比算法进行词性标注 开始进行词性标注: The: bear: is: o ...

  4. 隐马尔科夫模型HMM之前后向算法Python代码实现,包括2个优化版本

    ☕️ 本文系列文章汇总: (1)HMM开篇:基本概念和几个要素 (2)HMM计算问题:前后向算法 (3)HMM学习问题:Baum-Welch算法 (4)  HMM预测问题:维特比算法 本篇算法原理分析 ...

  5. 机器学习知识点(二十五)Java实现隐马尔科夫模型HMM之jahmm库

    1.隐马尔可夫模型HMM的应用场景,关乎于序列和状态变化的都可以.    发现java有可库,专为开发HMM,可惜只能在CSDN上有得下载.     2.jahmm是java开发隐马尔科夫模型的一个j ...

  6. 【机器学习算法】隐马尔可夫模型HMM(一)

    目录 一.马尔可夫模型 1. 马尔可夫性 2. 马尔可夫链 3. 马尔可夫链案例 二.隐马尔可夫模型HMM 1. named entity recognition(命名实体识别)问题概述 2. 什么是 ...

  7. 用隐马尔可夫模型(HMM)做命名实体识别——NER系列(二)

    上一篇文章里<用规则做命名实体识别--NER系列(一)>,介绍了最简单的做命名实体识别的方法–规则.这一篇,我们循序渐进,继续介绍下一个模型--隐马尔可夫模型. 隐马尔可夫模型,看上去,和 ...

  8. 《两日算法系列》之第四篇:隐马尔可夫模型HMM

    目录 1. 定义与假设 2. 相关概念的表示 3. 三个基本问题 3.1. 概率计算问题 3.2. 学习问题 3.3. 预测问题 总结 1. 定义与假设 李雷雷所在城市的天气有三种情况,分别是:晴天. ...

  9. 【机器学习】【隐马尔可夫模型-3】后向算法:算法详解+示例讲解+Python实现

    0.前排提示 csdn有些数学公式编辑不出来,所以本博用容易书写的表达式来表示专业数学公式,如: (1)  在本博客中用α<T>(i)来表示 (2)在本博客中用[i=1, N]∑来表示 注 ...

最新文章

  1. SparseArrayE详解
  2. 博科光纤交换机java_带有光纤的可扩展,健壮和标准的Java Web服务
  3. 车间生产能耗管控方案_如何给生产车间降温 环保空调的这些方案一定能帮到你...
  4. CCNP-第五篇-OSPF高级版(二)
  5. 两层卷积网络实现手写数字的识别(基于tensorflow)
  6. centos修改磁盘uuid_为什么MySQL用uuid做主键会被骂?
  7. 如何在不键入“退出”的情况下退出屏幕?
  8. Go语言中Tcp协议粘包问题处理
  9. C++并发与多线程(二) 创建多个线程、数据共享问题分析、案例代码
  10. 求最大公约数欧几里得算法
  11. 用Razor做静态页面生成器
  12. QTouch手机组态软件APP
  13. 黑客入侵 - 认识黑客入侵的利器 嗅探软件
  14. mtk2503电流设定失败
  15. PcShare2007 暗桩
  16. 在virtual box虚拟机上下载sniffer pro
  17. 20182319彭淼迪第一周学习总结
  18. 摄影_光圈、快门、曝光度(ISO)
  19. MTk kernel启动流程
  20. linux windos 设计理念,Windows 20 概念设计

热门文章

  1. Spring 详解(二):IOC 和DI
  2. 数据结构和算法分析:B树 B+树 和B*树的总结
  3. datagridview后台获取选中行的值的几种方式
  4. OC基础 代理和协议
  5. MaskedTextBox的聚焦和光标位置
  6. IOS sqlite数据库增删改查
  7. 【备忘】Oracle10g 创建、删除表空间、创建、授权用户
  8. activesync对应的COM口
  9. python离群点检测例子_异常点/离群点检测算法
  10. python字符串小数转化整数_python – Pandas将字符串列和NaN(浮点数)转换为整数,保持NaN...