`

自己实现了一个维特比(Viterbi)算法的Python版本

阅读更多

Viterbi的算法在这边就不解释了。 主要可以参考:

(1) Wiki

详细介绍了算法的原理与python实现。 

不过个人感觉看这个python的实现没太看懂。 于是乎自己在下面又写了一遍而且感觉相对来说要更清楚一些

 

(2) 知乎:谁能通俗的讲解下viterbi算法吗?

其中最高票的答案非常详细的一步步的描写了运算的过程

最好各位再在草稿纸上面写写画画以求彻底明白

 

最后贴一下我自己写出来的python实现:

# -*- coding: utf-8 -*-  

# ---- init some data ----
# 隐藏变量, states
states = ['h', 'f']

# 状态转移矩阵
Tr_p = {}
Tr_p['h'] = { 'h': 0.7, 'f': 0.3}
Tr_p['f'] = { 'h': 0.4, 'f': 0.6}

# 初始概率, star=*, 有的是用π来表示
star = {}
star['h'] = 0.6
star['f'] = 0.4

# 放射矩阵, n=normal, c=cold, d=dizzy
emission_p = {}
emission_p['h'] = { 'n' : 0.5, 'c' : 0.4, 'd':0.1 }
emission_p['f'] = { 'n' : 0.1, 'c' : 0.3, 'd':0.6 }


# 实际的观察值
obser_vals = ['n', 'c', 'd']


def get_max_from_dict(delta) :
	max_val = 0
	max_key = ""

	for key in delta.keys() :
		if delta[key] > max_val :
			max_key = key 
			max_val = delta[key]

	return max_key, max_val
def viterbi() :
	# delta 用于保存当前状态下
	delta_i = {}
	path_i = []
	prob_i = []
	# 首先计算第一天的状态
	# delta_i['h'] = star['h'] * emission_p['h']['n']
	# delta_i['f'] = star['f'] * emission_p['f']['n']
	for state in states :
		delta_i[state] = star[state] * emission_p[state][obser_vals[0]]	
	

	key, val = get_max_from_dict(delta_i)
	path_i.append(key)
	prob_i.append(val)
	# 从第二天开始计算,直到最后一天
	for i in range(1, len(obser_vals)) :
		lastState = path_i[-1]
		obser_val = obser_vals[i]

		# 防止出错,清空delta_i
		delta_i = {}
		for state in states :
			# Δ2(h)        = Δ1(h)      * Tr(h->h)               * e(h | c)
			delta_i[state] = prob_i[-1] * Tr_p[lastState][state] * emission_p[state][obser_val]
			print "delta_i[state]=", delta_i[state]

		# 获取当前概率最大的路径
		key, val = get_max_from_dict(delta_i)
		path_i.append(key)
		prob_i.append(val)

	print path_i
	
viterbi()






 

分享到:
评论

相关推荐

    数据结构与算法:一图弄懂维特比viterbi算法

    一、viterbi算法的用途 在自然语言的工程实践中,viterbi算法常常被用来寻找最可能的隐藏状态序列。如,序列标注任务就需要用到viterbi算法。 二、viterbi求最优路径 李航老师《统计机器学习》有如下例题: 用...

    HMM及其算法(前向,Viterbi,Baum-Welch)

    2. **解码问题:** 给定一个HMM模型\( \lambda \)和一个观察序列\( O \),找出最有可能产生这个观察序列的一系列隐藏状态序列。这个问题可以通过**Viterbi算法**解决。 3. **学习问题:** 给定一系列观察序列,学习...

    前向算法+后向算法+Viterbi算法实践

    在给定的“前向算法+后向算法+Viterbi算法实践”中,你将学习如何用Python实现这些算法,处理盒子球模型的观察序列。这通常涉及到定义HMM的参数(初始状态分布π,状态转移矩阵A,观测发射概率B),然后应用这些算法...

    基于HMM的语音识别系统,python实现版本

    3. **模型评估**:使用维特比算法(Viterbi decoding)找到最有可能产生观测序列的模型状态序列。 4. **模型解码**:对未知语音进行识别,找到与之最匹配的模型状态序列,从而确定识别结果。 ### 三、Python实现的...

    维特比译码matlab代码-convolutional_code_python:使用维特比算法解码卷积码

    本资源中的"convolutional_code_python-main"可能包含了一个用Python实现的维特比解码框架。尽管Python在速度上不占优势,但其开源和易于理解的特性使得代码更易于维护和扩展。对于学习和研究目的,Python提供了很好...

    使用维特比算法软解码卷积码:使用维特比算法解码卷积码-matlab开发

    维特比算法(Viterbi Algorithm)是解码卷积码的最优化方法,由阿瑟·维特比于1967年提出,它能有效地找到最可能的传输序列,即使在存在噪声或错误的情况下也是如此。 卷积码的工作原理基于线性反馈移位寄存器,...

    Forward Viterbi Algorithm:Forward Viterbi 算法基于:http://en.wikipedia.org/wiki/Viterbi_algorithm-matlab开发

    还包括一个基于 Wikipedia 页面的示例,该示例用于具有 4 个观察值的简单 2 状态模型。 转述: 鲍勃告诉爱丽丝他的日常活动(观察结果),爱丽丝想确定每天最可能的天气(州)。 由于爱丽丝住在很远的地方,她不...

    python实现hmm

    3. **转移概率(Transition Probability)**: 表示从一个状态转移到另一个状态的概率。 4. **发射概率(Emission Probability)**: 表示在某个状态下观测到特定观测值的概率。 5. **初始概率(Initial Probability)...

    卷积编码译码程序代码

    译码过程通常是基于维特比算法(Viterbi Algorithm)进行的,这是一种最优路径搜索算法。在接收端,接收到的码流通过卷积解码器,根据最大似然原则找到最有可能产生的原始数据序列。维特比算法通过计算每一步的不同...

    Python实现HMM模型完美版.zip_HMM_HMM python_divisionqss_jieba的hmm模型_pyth

    标题中的“Python实现HMM模型完美版.zip_HMM_HMM python_divisionqss_jieba的hmm模型_pyth”表明这是一个关于使用Python编程语言实现隐马尔科夫模型(Hidden Markov Model,简称HMM)的代码资源,其中可能包含了...

    HMM_Study:研究隐马尔可夫模型,包括前向算法,维特比算法,前向后向算法

    在这个HMM_Study项目中,我们将深入探讨HMM的核心概念,以及如何利用Python实现前向算法、维特比算法和前向后向算法。 首先,我们要理解HMM的基本构成:状态(State)、观测(Observation)和转移概率(Transition ...

    hmm.rar_EM HMM_HMM_EM_em算法 hmm_hmm em实现_hmm程序

    HMM的两个核心问题是前向-后向算法(Forward-Backward Algorithm)和维特比算法(Viterbi Algorithm),它们分别用于计算在给定观测序列下每个时间步的状态概率和找到最有可能的路径。 EM算法在HMM中的应用主要包括...

    Python库 | vbihmm-1.01.tar.gz

    8. **社区支持与更新**:作为开源项目,vbihmm-1.01可能有一个活跃的开发者社区,提供技术支持和版本更新,确保其兼容最新的Python版本,并持续优化性能。 在实际应用中,vbihmm-1.01库可以用于多种任务,例如: -...

    Python库 | hmmlearn-0.2.3-cp37-cp37m-manylinux1_x86_64.whl

    给定的资源`hmmlearn-0.2.3-cp37-cp37m-manylinux1_x86_64.whl`是一个预编译的Python wheel文件,适用于Python 3.7版本,并且是为x86_64架构的Linux系统设计的。要安装这个库,可以使用以下命令: ```bash pip ...

    ViterbiAlgorithm.rar_通讯编程_Unix_Linux_

    在Unix/Linux环境中,Viterbi算法的实现通常涉及C、C++或Python等编程语言,因为这些语言对于处理底层算法和系统级编程具有良好的支持。开发者可能需要理解并实现状态机模型,其中每个状态代表了可能的数据序列,每...

    隐马尔可夫模型(HMM) Python代码 《统计学习方法》李航

    - **维特比算法(Viterbi Algorithm)**:找到最有可能生成给定观测序列的状态序列。 Python代码部分可能涵盖了上述概念的实现,包括创建HMM模型、进行参数估计、执行解码算法等。通过实际操作,读者可以更好地掌握...

    Python库 | pomegranate-0.14.4-cp38-cp38-win32.whl

    `pomegranate`提供了全面的HMM实现,包括维特比算法(Viterbi algorithm)进行最优化状态路径预测,Baum-Welch算法进行参数估计,以及前向-后向算法进行概率计算。HMMs在语音识别、生物信息学等领域有广泛应用。 **...

    隐马尔可夫模型Python代码.zip

    - **解码(Decoding)**:给定模型参数和观测序列,找出最有可能的隐藏状态序列,通常使用维特比算法(Viterbi Algorithm)。 - **评估(Evaluation)**:计算给定模型参数和观测序列下某一特定隐藏状态序列的概率,...

Global site tag (gtag.js) - Google Analytics