前向算法Python实现
前言
这里的前向算法与神经网络里的前向传播算法没有任何联系。。。这里的前向算法是自然语言处理领域隐马尔可夫模型第一个基本问题的算法。
前向算法是什么?
这里用一个海藻的例子来描述前向算法是什么。网上有关于前向算法的严格数学推导,不过感觉还是海藻的例子比较好一些。网上的例子有很多都是有问题的,在本文中也都进行了相应的修正。
状态转移矩阵
相关性矩阵
初始状态序列:Sunny(0.63),Cloudy(0.17),Rainy(0.20)
我们想要求一个观察序列{Dry, Damp, Soggy}的概率。
具体怎么求这个概率,数学上有严格的推导流程,这里不再进行阐述,这里仅针对前向算法进行阐述。
前向算法的Python实现
前向算法的问题尽管看起来和维特比算法解决的问题不太一样,但是套路实际上是完全相同的。
首先可以利用numpy将数据加入到python代码中
import numpy as np
# 前向算法
tran = np.array([[0.5, 0.375, 0.125],
[0.25, 0.125, 0.625],
[0.25, 0.375, 0.375]])
laun = np.array([[0.6, 0.2, 0.15, 0.05],
[0.25, 0.25, 0.25, 0.25],
[0.05, 0.1, 0.35, 0.5]])
init = np.array([0.63, 0.17, 0.2])
look = np.array([0, 2, 3]) # 观测序列
kind = ['Sunny', 'Cloudy', 'Rainy']
P(第一天海藻状态为0&晴天)=P(海藻状态为0|晴天)P(晴天|初始状态)
这样的话,便可以把第一天海藻状态为0的情况下,晴天、多云、雨天的概率都算出来。
P(第二天海藻状态为2&晴天)=(P(第一天海藻状态为0|晴天)P(今天晴天|前一天为晴天)+P(第一天海藻状态为0|雨天)P(今天晴天|前一天为雨天)+P(第一天海藻状态为0|阴天)P(今天晴天|前一天为阴天))*P(海藻为2|晴天)
这个算是用python代码写下来的话如下所示:
dp[j] = sum(np.array([a * b for a, b in zip(temp, tran[:,j])]))*laun[j,look[i]]
完整代码如下:
dp = np.array([a * b for a, b in zip(init, laun[:, look[0]])])
for i in range(1,3):
temp = np.copy(dp)
for j in range(3):
dp[j] = sum(np.array([a * b for a, b in zip(temp, tran[:,j])]))*laun[j,look[i]]
print(sum(dp))
可以发现,这段代码与维特比算法的代码基本完全相同,只不过最后利用的方式不同,维特比算法是求出了最大的dp值,然后就得到了对应的最大可能的隐藏序列。而求和的话,则可以得到对应的标记序列的出现可能性。
前向算法Python实现的更多相关文章
- 2016年GitHub排名前20的Python机器学习开源项目(转)
当今时代,开源是创新和技术快速发展的核心.本文来自 KDnuggets 的年度盘点,介绍了 2016 年排名前 20 的 Python 机器学习开源项目,在介绍的同时也会做一些有趣的分析以及谈一谈它们 ...
- kmp算法python实现
kmp算法python实现 kmp算法 kmp算法用于字符串的模式匹配,也就是找到模式字符串在目标字符串的第一次出现的位置比如abababc那么bab在其位置1处,bc在其位置5处我们首先想到的最简单 ...
- KMP算法-Python版
KMP算法-Python版 传统法: 从左到右一个个匹配,如果这个过程中有某个字符不匹配,就跳回去,将模式串向右移动一位.这有什么难的? 我们可以 ...
- HMM 自学教程(五)前向算法
本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,这是针对 国外网站上一个 HMM 教程 的翻译,作者功底很深,翻译得很精彩 ...
- pageRank算法 python实现
一.什么是pagerank PageRank的Page可是认为是网页,表示网页排名,也可以认为是Larry Page(google 产品经理),因为他是这个算法的发明者之一,还是google CEO( ...
- 常见排序算法-Python实现
常见排序算法-Python实现 python 排序 算法 1.二分法 python 32行 right = length- : ] ): test_list = [,,,,,, ...
- HMM:隐马尔科夫模型-前向算法
http://blog.csdn.net/pipisorry/article/details/50722376 目标-解决HMM的基本问题之一:已知HMM模型λ及观察序列O,如何计算P(O|λ)(计算 ...
- HMM模型学习笔记(前向算法实例)
HMM算法想必大家已经听说了好多次了,完全看公式一头雾水.但是HMM的基本理论其实很简单.因为HMM是马尔科夫链中的一种,只是它的状态不能直接被观察到,但是可以通过观察向量间接的反映出来,即每一个观察 ...
- HMM条件下的 前向算法 和 维特比解码
一.隐马尔科夫HMM如果: 有且仅仅有3种天气:0晴天.1阴天.2雨天 各种天气间的隔天转化概率mp: mp[3][3] 晴天 阴天 雨天 晴天 0.33333 0.33333 0.33333 阴天 ...
随机推荐
- JMeter(十四)-自动生成测试报告
很多朋友都在问jmeter如何生成测试报告,这里随便说两句. 环境要求 1:jmeter3.0版本之后开始支持动态生成测试报表 2:jdk版本1.7以上 3:需要jmx脚本文件 基本操作 1:在你的脚 ...
- 虚拟机窗口太小_安装VMware Tools(winxp)
1.新安装完系统后窗口较小 2.在虚拟机->安装VMware Tools 3.如果像上图一样,“安装VMware Tools”是灰色的,那么在虚拟机设置中再添加一个CD/DVD驱动器 4.然后进 ...
- Elasticsearch教程-从入门到精通(转)
原文:http://mageedu.blog.51cto.com/4265610/1714522?utm_source=tuicool&utm_medium=referral 各位运维同行朋友 ...
- Scala安装配置
注:下载地址:http://downloads.typesafe.com/scala/2.11.6/scala-2.11.6.tgz?_ga=1.41078626.1125902863.1429259 ...
- "context:annotation-config" and "context:component-scan"
1.<context:annotation-config/>注册多个处理器 <context:annotation-config/>作用是向 Spring 容器注册 Autow ...
- JAVA包装类介绍(一)(包装类、基本类型数据)
1. 包装类把基本类型数据转换为对象 1.1每个基本类型在java.lang包中都有一个相应的包装类 2.包装类有何作用 2.1 提供了一系列实用的方法 2.2集合不允许存放基本数据类型 ...
- VB.net 与线程
Imports System.Threading Imports System Public Class Form1 Dim th1, th2 As Thread Public Sub Method1 ...
- js之数组排序
数组,大家都不陌生,只要是学编程的人都知道这个入门的数据结构,在js中也是有数组这个概念的,跟普通的数组一样只是定义的形式不同罢了.下面是一个数组的排序代码: <html> <hea ...
- mvc actionresult返回各种文件
public ActionResult ReviewFile(string folderName, string fileBasename, string extendName) { //以后根据后缀 ...
- uva10905
/* 很好的字符串 比较方法 很多个字符串 组成的 数字 需要最大 然后 比较 a和b 是 比较a+b 和b+a 的大小 */ #include<cstdio> #include<s ...