前言

写这篇文章就是想以通俗易懂的方式解析维特比算法,最后给出Python代码的实现。下面的公式和原理均出自《统计学习方法》。

算法的原理

算法的原理1.PNG

算法的原理2.PNG

上面写了一大堆,意思就是:每个时刻选择出概率最大的路径,将路径上的每个结点连接起来就得到了最优路径。那么可以根据这个原理,很容易就可以根据观测求出每个时刻最有可能的状态。

算法的思路

算法思路1.PNG

算法思路2.PNG

下面我们可以根据算法的原理,分析书上算法的思路。

步骤(1)初始化:

t = 1时刻分别求出N个状态下产生观测变量1的概率。

步骤(2)递推:

当t和i不变时j = 1,2,3,...,N是分别求出t - 1时刻所有可能的状态,转移到t时刻状态i的概率。max是求最大值,就是在t-1时刻各个状态转移到t时刻状态 i 的最大概率,最后乘以观测概率就是t状态 i 最有可能产生观测变量 t 的概率。argmax是求在t-1时刻的状态最有可能转移到 t 时刻的状态 i 。

如果想求出t - 1时刻的所有可能状态转移到 t 时刻所有可能状态的最大概率,则在步骤(2)的式子最外层再增加一个循环i = 1,2,3,...,N。

如果想求出各个时刻最有可能的状态,则在步骤(2)的式子最外层增加一个循环t = 2,3,4,...,T。

步骤(3)终止:

这个很简单没什么好说的了。

步骤(4)最优路径回溯:

根据t = T时刻最有可能的状态反向推出t = T - 1, t = T - 1,...,2,1时刻最有可能的状态。

完整实现代码

import numpy as np

from numpy import *

import math

def viterbi(A, B, PI, O):

N = shape(A)[0]

I = mat(zeros((N, 1)))

T = N

sigma = mat(zeros((N, N)))

omiga = mat(ones((N, N)))

index = 0

for i in range(N):

if(O[0, 0] == 0):

index = 0

else:

index = 1

sigma[0, i] = PI[i, 0] * B[i, index]

t = 1

while(t < T):

for i in range(N):

sigma_temp = mat(zeros((N, 1)))

for j in range(N):

sigma_temp[j, 0] = sigma[t - 1, j] * A[j, i]

max_value = sigma_temp.max(axis = 0)

if(O[t, 0] == 0):

index = 0

else:

index = 1

sigma[t, i] = max_value[0, 0] * B[i, index]

omiga[t, i] = sigma_temp.argmax() + 1

t += 1

P = sigma[N - 1, :].max()

I[T -1, 0] = sigma[N - 1, :].argmax() + 1

t = T - 2

print(omiga)

while(t >= 0):

index = int(I[t + 1, 0] - 1)

I[t, 0] = omiga[t + 1, index]

t -= 1

return I

if __name__ == "__main__":

A = mat([[0.5, 0.2, 0.3],

[0.3, 0.5, 0.2],

[0.2, 0.3, 0.5]])

B = mat([[0.5, 0.5],

[0.4, 0.6],

[0.7, 0.3]])

PI = mat([[0.2],

[0.4],

[0.4]])

O = mat([[0],

[1],

[0]])

I = viterbi(A, B, PI, O)

print(I)

输入数据

输入数据和《统计学习方法》这本书上的例子一样

A = mat([[0.5, 0.2, 0.3],

[0.3, 0.5, 0.2],

[0.2, 0.3, 0.5]])

B = mat([[0.5, 0.5],

[0.4, 0.6],

[0.7, 0.3]])

PI = mat([[0.2],

[0.4],

[0.4]])

O = mat([[0],

[1],

[0]])

输入数据.PNG

本文的输出结果

输出结果.PNG

书上的输出结果

书上的输出结果.PNG

两者结果对比是一样的,有兴趣的可以运行一下我的代码,打印出w这个参数的值,也是和书上的例子是一样的。

维特比算法 python_维特比算法理解与实现(Python)相关推荐

  1. 哈希算法python_哈希算法(Python代码实现)

    1.常见的数据查找算法: 众所周知,顺序查找是最简单的查找方式,但要将所有数据遍历一遍所以效率相对较低,对大数据量的査找问题显然不行.二分查找的查找效率虽然非常高但是数据必须有序,而对数据排序通常需要 ...

  2. 逻辑回归算法python_逻辑回归算法原理和例子

    本课程讲解现在工业界和学术界流行的机器学习算法的相关知识,以及如何用python去实现这些算法.算法的讲解包括supervised learning(有监督式学习)和unsupervised lear ...

  3. 蚂蚁算法python_蚁群算法python编程实现

    前言 这篇文章主要介绍了Python编程实现蚁群算法详解,涉及蚂蚁算法的简介,主要原理及公式,以及Python中的实现代码,具有一定参考价值,需要的朋友可以了解下. 蚁群算法简介 蚁群算法(ant c ...

  4. 人工蜂群算法python_人工蜂群算法简介与程序分析

    目前人工蜂群算法主要分为基于婚配行为与基于釆蜜行为两大类,本文研究的是基于釆蜜行为的人工蜂群算法. 蜜蜂采蜜 自然界中的蜜蜂总能在任何环境下以极高的效率找到优质蜜源,且能适应环境的改变.蜜蜂群的采蜜系 ...

  5. 自动寻路算法python_关于Dijkstra算法和其他的一些图算法(Johnson, Floyd-Warshall, A*)解决最短路径问题的方法的Python实现。...

    这篇文章其实主要想说的是如何解决最短路径的问题. 其实最短路径问题,我们在生活中都在不知不觉的使用.比如我们在上网的时候,互联网传输采用了各种各样的数据包路由方法.这些路由算法都在幕后工作. 还有一些 ...

  6. 人工鱼群算法python_蚁群算法、免疫优化算法、鱼群算法 Python 库

    github地址guofei9987/scikit-opt​github.com 安装 $pip install scikit-opt 蚁群算法(ACA, Ant Colony Algorithm) ...

  7. 花朵授粉算法python_花授粉算法的研究及应用

    摘要: 植物花授粉算法是根据自然界中植物花朵授粉行为机理进行模拟而设计的一种新型启发式优化算法,算法的局部搜索和全局搜索过程分别模拟自花授粉和异花授粉行为,并通过随机扰动来均衡算法局部搜索和全局搜索过 ...

  8. 维特比算法 python_维特比算法 实现中文分词 python实现

    最近我在学习自然语言处理,相信大家都知道NLP的第一步就是学分词,但分词≠自然语言处理.现如今分词工具及如何使用网上一大堆.我想和大家分享的是结巴分词核心内容,一起探究分词的本质. (1).基于前缀词 ...

  9. 维特比算法 python_维特比算法实现分词

    维特比算法原理可以参考以下文章,讲解的非常详细,那么接下来将讲解维特比算法如何应用到分词算法中,并如何用python代码实现.如何通俗地讲解 viterbi 算法?​www.zhihu.com 一.过 ...

最新文章

  1. 图解自监督学习,人工智能蛋糕中最大的一块
  2. dw html5怎么美化,DW CS5/CS6代码格式化、美化插件 Dreamweaver代码格式化美化插件
  3. java日期大小比较(亲测)
  4. Delphi识别读取验证码
  5. mongodb服务部署
  6. eacharts中国地图省市区点击显示
  7. java中判断字段真实长度(中文2个字符,英文1个字符)的方法
  8. SpringBoot登录登出切面开发
  9. VirtualAlloc和VirtualCopy的蕴含知识点
  10. MVC 中Simditor上传本地图片
  11. 【算法】回溯法——0-1背包问题
  12. python库tkinter、pygame中几点需要注意的问题
  13. Class.forName()、Class.forName().newInstance() 、New 三者区别!
  14. 参数等效模型可以用于_华北电力大学 陈宁、齐磊 等:适用于柔性直流电网操作过电压分析的混合式高压直流断路器端口等效模型...
  15. 大数据:技术与应用实践指南
  16. py+webdriver学习之旅6:cookie
  17. ASP.NET全套视频教程
  18. module not specified如何解决
  19. 【pip】pip安装github项目
  20. PHP使用 Redis 实现消息队列

热门文章

  1. 周华健·周杰伦·周笔畅
  2. 【GitHub.io/Github Pages使用教程】从头开始搭建自己的Github Pages,打造个人博客网站,展示个人简历、项目、文档或想要与世界共享的任何其他内容
  3. BlueTooth: nRF51822蓝牙芯片
  4. 什么是开源生态?———— 《硅谷生态圈》书评
  5. 做棋牌,该怎么设计你的代码
  6. 网友分享失联9天的经历,看得人直冒冷汗,真的不能再熬夜了!
  7. Open3D Usage
  8. 【媒体报道】Fengqi.Asia雲端能避免港姐公投崩潰
  9. 通过路由器搭建内网穿透隧道
  10. 《Effective C++》 总结篇(模板与泛型编程)