`
xglv2013
  • 浏览: 38004 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

隐马尔可夫模型之:维特比算法

阅读更多
        接上一篇博客的内容,给出利用已知的隐马尔可夫模型和观察状态序列,输出最可能的隐藏状态序列的算法,该算法由著名信息学大师维特比提出,所以叫做维特比算法(viterbi algorithm),这其实是一个解码的过程。维特比算法依然利用动态规划,时间复杂度跟前向算法相同,最大的区别有两个:1.求和变为取最大值,即计算问题变为最优化问题 2.增加了回溯,利用一个前驱数组,记录了每条最优(也就是概率最大)的子隐藏状态序列的每个节点的前驱。java程序如下:
package hmm;

import java.util.HashMap;
import java.util.Map;

/**
 * 隐马尔可夫模型
 * @author xuguanglv
 *
 */
public class Hmm {
	//初始概率向量
	private static double[] pai = {0.333, 0.333, 0.333};
	
	//状态转移矩阵
	private static double[][] A = {{0.333, 0.333, 0.333},
							        {0.333, 0.333, 0.333},
							        {0.333, 0.333, 0.333}};
	
	//混淆矩阵
	private static double[][] B = {{0.5, 0.5},
							        {0.75, 0.25},
							        {0.25, 0.75}};
	
	//隐藏状态索引
	private static Map<Integer, String> hiddenStateIndex = new HashMap<Integer, String>();
	static{
		hiddenStateIndex.put(0, "S(0)");
		hiddenStateIndex.put(1, "S(1)");
		hiddenStateIndex.put(2, "S(2)");
	}
	
	//观察状态索引
	private static Map<String, Integer> observableStateIndex = new HashMap<String, Integer>();
	static{
		observableStateIndex.put("O(0)", 0);
		observableStateIndex.put("O(1)", 1);
	}
	
	//维特比算法 根据观察状态序列和已知的隐马尔可夫模型 返回最可能的隐藏状态序列
	//delta[t][j]表示t时刻最可能生成O(0) O(1) ... O(t)的以状态j为结尾的隐藏状态序列出现的概率
	public static String[] viterbi(String[] observedSequence){
		String[] hiddenSequence = new String[observedSequence.length];
		double[][] delta = new double[observedSequence.length][A.length];
		//一个前驱数组 predecessor[t][j]表示以状态j为结尾的概率最大的隐藏状态序列中j的前一个状态
		int[][] predecessor = new int[observedSequence.length][A.length];
		
		//利用动态规划计算出delta数组
		//初始化
		for(int i = 0; i <= A.length - 1; i++){
			int index = observableStateIndex.get(observedSequence[0]);
			delta[0][i] = pai[i] * B[i][index];
		}
		for(int i = 0; i <= A.length - 1; i++){
			predecessor[0][i] = -1;
		}
		for(int t = 1; t <= observedSequence.length - 1; t++){
			for(int j = 0; j <= A.length - 1; j++){
				double max = 0;
				for(int i = 0; i <= A.length - 1; i++){
					if(delta[t - 1][i] * A[i][j] > max){
						max = delta[t - 1][i] * A[i][j];
						predecessor[t][j] = i;
					}
				}
				int index = observableStateIndex.get(observedSequence[t]);
				delta[t][j] = max * B[j][index];
			}
		}
		//max就是生成整个观察状态序列的最可能的隐藏状态序列的概率
		//lastHiddenIndex用来表示这最可能的隐藏状态序列的最后一个隐藏状态
		double max = 0;
		int lastHiddenIndex = 0;
		for(int i = 0; i <= A.length - 1; i++){
			if(delta[observedSequence.length - 1][i] > max){
				max = delta[observedSequence.length - 1][i];
				lastHiddenIndex = i;
			}
		}
		//回溯出最可能生成观察状态序列的隐藏状态序列的每一个隐藏状态 放入hiddenSequence
		hiddenSequence[observedSequence.length - 1] = hiddenStateIndex.get(lastHiddenIndex);
		int curHiddenIndex = lastHiddenIndex;
		for(int t = observedSequence.length - 1; t >= 1; t--){
			hiddenSequence[t - 1] = hiddenStateIndex.get(predecessor[t][curHiddenIndex]);
			curHiddenIndex = predecessor[t][curHiddenIndex];
		}
		
		return hiddenSequence;
	}
	
	public static void main(String[] args){
		String[] observedSequence = {"O(0)", "O(0)", "O(0)", "O(0)", "O(1)", "O(0)", "O(1)", "O(1)", "O(1)", "O(1)"};
		String[] hiddenSequence = viterbi(observedSequence);
		for(String hiddenState : hiddenSequence){
			System.out.print(hiddenState + " ");
		}
	}
}
0
0
分享到:
评论

相关推荐

    隐马尔可夫模型维特比算法尝试

    ### 隐马尔可夫模型与维特比算法详解 #### 一、隐马尔可夫模型基本概念 隐马尔可夫模型(Hidden Markov Model, HMM)是一种统计模型,它主要用来描述一系列观察到的数据是如何由一系列未知的状态产生的。这种模型的...

    隐马尔可夫模型(HMM)前向算法实例维特比算法实例

    维特比 隐马尔可夫模型 HMM 前向算法 里面含有真实示例,包括手动运算

    使用隐马尔可夫模型与维特比算法进行中文分词标注,c++编写。语料库为人民日报

    使用隐马尔可夫模型与维特比算法进行中文分词标注,c++编写。语料库为人民日报语料库(1998年1月至_NLP-HMM-viterbi

    HMM隐马尔可夫模型用于中文分词

    隐马尔可夫模型(Hidden Markov Model,HMM)是一种统计模型,被广泛应用于模式识别、自然语言处理等领域。HMM的核心思想是通过一个可以观察的马尔可夫过程来描述一个隐含的状态序列,其中状态不可直接观察到,但每...

    10.2 基于隐马尔可夫模型(HMM)的孤立字语音识别_隐马尔可夫模型(HMM)的孤立字语音识别_

    在本主题中,我们将深入探讨基于隐马尔可夫模型(HMM)的孤立字语音识别方法,并结合MATLAB程序实现进行讲解。 隐马尔可夫模型(Hidden Markov Model, HMM)是概率统计模型,广泛应用于自然语言处理、生物信息学...

    隐马尔可夫模型c代码

    隐马尔可夫模型(Hidden Markov Model,简称HMM)是概率统计领域的一种重要模型,广泛应用于自然语言处理、语音识别、生物信息学等多个IT领域。本模型的核心思想是,尽管我们无法直接观测到系统的真实状态,但可以...

    第20章-隐马尔可夫模型

    ### 隐马尔可夫模型详解 #### 一、隐马尔可夫模型概述 隐马尔可夫模型(Hidden Markov Model, HMM)作为一种...无论是从理论角度还是实际应用场景来看,隐马尔可夫模型都是理解和解决序列预测问题的重要工具之一。

    C ++ 中维特比算法和隐马尔可夫模型的实现

    Implementation of Viterbi algorithm and Hidden Markov Model in C++ 维特比算法和隐马尔可夫模型的 C++ 实现 To run the demo in linux(unix), type the following command: (1) $ make (2) $ ./viterbi_demo

    隐马尔可夫模型

    ### 隐马尔可夫模型 (HMM) 概念与应用 #### 一、马尔可夫性 在探讨隐马尔可夫模型之前,我们先了解马尔可夫性的基本概念。马尔可夫性指的是一个过程的未来状态只依赖于当前状态,而与过去的状态无关。这一特性在很...

    隐马尔可夫模型源代码(matlab)

    隐马尔可夫模型(Hidden Markov Model,简称HMM)是概率统计领域的一种重要模型,广泛应用于自然语言处理、语音识别、生物信息学等多个领域。在本资源中,我们有MATLAB编写的HMM源代码,对于学习和理解HMM的原理以及...

    基于隐马尔可夫模型的语音识别算法

    ### 基于隐马尔可夫模型的语音识别算法 #### 实验目的 1. **理解隐马尔科夫模型(HMM)的基本概念及其关键算法**:实验旨在让学生全面掌握HMM的基础理论,包括模型的基本结构、状态转换、观测序列等核心要素。 2. *...

    隐马尔可夫模型和词性标注笔记

    隐马尔可夫模型(HMM)是一种统计建模方法,尤其在自然语言处理和语音识别领域中广泛应用。它基于马尔可夫模型的概念,但增加了“隐藏”或不可观测的状态,这些状态通过一系列可观察的输出来表现。在HMM中,系统处于...

    隐马尔可夫模型 ppt

    隐马尔可夫模型(Hidden Markov Model,简称HMM)是概率模型的一种,主要用于描述一个随机过程,其中系统的状态不直接可见,只能通过一系列间接的观察来推断。HMM的思想最早由Baum和他的同事在20世纪60年代末至70...

    (ACM比赛笔记、隐马尔可夫模型+维特比进行词性标注、改进和声搜索算法+BP神经网络、Petri网参数优化).zip

    2. 隐马尔可夫模型(HMM)与维特比算法:隐马尔可夫模型是一种统计学模型,常用于序列数据的建模,如语音识别、自然语言处理中的词性标注。词性标注是将文本中的每个词分配到相应的词性标签的过程。维特比算法是HMM...

    sample_mhmm.zip_mHMM_隐马尔可夫模型_马尔可夫

    隐马尔可夫模型(Markov Hidden Model, 简称mHMM)是一种在概率统计领域广泛应用的数学模型,特别是在自然语言处理、生物信息学、语音识别和时间序列分析等多个IT领域。这个模型的核心思想是,当前状态只依赖于前一...

    C#编写的隐马尔可夫模型分词程序

    **C#编写的隐马尔可夫模型分词程序** 隐马尔可夫模型(Hidden Markov Model,HMM)是一种统计学模型,常用于自然语言处理中的词性标注、语音识别、机器翻译等任务。在C#编程环境中,我们可以构建HMM来实现中文分词...

    隐马尔可夫模型 工具箱matlab 代码

    隐马尔可夫模型(Hidden Markov Model,简称HMM)是一种统计建模方法,广泛应用于自然语言处理、语音识别、生物信息学等领域。在MATLAB中,开发HMM工具箱是为了方便研究者和工程师进行相关算法的实现与实验。本工具...

Global site tag (gtag.js) - Google Analytics