前向算法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 阴天 ...
随机推荐
- C# 多线程 详解
[基础篇] 怎样创建一个线程 受托管的线程与Windows线程 前台线程与后台线程 名为BeginXXX和EndXXX的方法是做什么用的 异步和多线程有什么关联 [WinForm多线程编程篇] 多线程 ...
- LoadRunner-参数化(连接数据库)
多用户并发测试,用户信息来自数据库,对脚本中accounts值替换为参数后,打开参数列表. 1.点击 Data Wizard...:选择Specify SQL statement manu: 2.点击 ...
- sass的@at-root
一.首先理解sass的嵌套中 &表示是什么? &表示整个选择器,而不单个class属性值或id属性值或tagName.例如下面一段代码: .a { .b { & { color ...
- Oracle与Sql server 在SQL上的不同
Oracle与Sql server都遵循SQL-92标准:http://owen.sj.ca.us/rkowen/howto/sql92F.html,但是也有一些不同之处,差别如下: Oracle中表 ...
- android activity and fragment活动周期
1.状态 /* 每个活动一共有四种状态 *:1.运行状态,就是栈顶的那个 * 2.暂停状态:就是不处于栈顶,但是依然可见,比如对话框下面的界面 * 3.停止状态:不处于栈顶,并且不可见 * 4.销毁状 ...
- Linux(CentOS)安装Mysql数据库
1.需要mysql-linux安装包 本次使用mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz进行安装 2.将此安装包上传至linux服务器 上传路径为:/usr ...
- ID和Name
ID和Name都可以用来标识一个标记,Javascript分别有两个方法getElementById和getElementByName来定位Dom节点. 区别如下: 1.我们知道在网页做Post提交时 ...
- Android中Activity的四种开发模式
Activity的四种启动模式:standard.singleTop.singleTask.singleInstance 清单文件中的Activity配置使用:android:launchMode ...
- !! A股历史平均市盈率走势图
http://value500.com/PE.asp 一. A股历史平均市盈率走势图 *数据来源:上海证券交易所 分享到: 354 - 上海A股 深圳A股更新时间 2017年6月7日 2017年6月7 ...
- 转载自(http://snailz.diandian.com/post/2012-10-24/40041265730)
PHP 5.4.8 添加系统服务命令 之前没注意,PHP 5.4.8 的安装包有自带的系统服务注册文件的 打开编译安装包,换成你自己的路径 cd /mydata/soft/php-5.4.8/ cp ...