前向算法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值,然后就得到了对应的最大可能的隐藏序列。而求和的话,则可以得到对应的标记序列的出现可能性。

原文地址:https://www.cnblogs.com/zhenlingcn/p/8410042.html

时间: 2024-10-11 12:06:18

前向算法Python实现的相关文章

2016年GitHub排名前20的Python机器学习开源项目(转)

当今时代,开源是创新和技术快速发展的核心.本文来自 KDnuggets 的年度盘点,介绍了 2016 年排名前 20 的 Python 机器学习开源项目,在介绍的同时也会做一些有趣的分析以及谈一谈它们的发展趋势.和去年一样,KDnuggets 介绍了 GitHub 上最新的并且排名前 20 的 Python 机器学习开源项目.令人吃惊的是,去年一些最活跃的项目已经停滞不前了,也有一些项目跌出了前 20 名(在 contribution 和 commit 方面),当然,也有 13 个新项目进入了前

HMM:前向算法实例

看本篇文章,假设你已经知道HMM中的前向算法相关概念 如果不知道,推荐先学习HMM学习最佳范例中相关文章 这个问题来自于HMM学习最佳范例五:前向算法5 只不过再手动算一下,加深一下自己的理解 已知隐马尔科夫模型如下: 1.隐藏状态 (天气):Sunny,Cloudy,Rainy: 2.观察状态(海藻湿度):Dry,Dryish,Damp,Soggy: 3.初始状态概率: Sunny(0.63), Cloudy(0.17), Rainy(0.20): 4.状态转移矩阵: 5.混淆矩阵: M=4(

隐马尔可夫模型的前向算法(java实现),今天奉上

隐马尔可夫模型的前向算法(手动实现),今天奉上,由于研究生期间,实现的时候没有多加注释,这里为了让更好的人进入自然语言处理领域,特此,将前向算法奉上,具体公式可参考52nlp的HMN系列博客. 参考了大部分网站公式和借鉴.在此表示感谢. 后向算法和维特比算法,后续更新. HMM类: 1 package jxutcm.edu.cn.hmm.model;  2   3 import jxutcm.edu.cn.hmm.bean.HMMHelper;  4   5 /**  6  * 实现了 HMM(

前向算法的数学意义上的实现

首先是前向算法 前向算法demo文件:fwd_demo.m 1 %% 前向算法的demo 2 %% 验证的例子参见<统计学习方法>p177 3 %% 4 5 % (编码:红1,白2) 6 % 初始概率分布 7 pi=[0.2 0.4 0.4] 8 9 % 概率转移矩阵 10 A=[ 0.5 0.2 0.3; 11 0.3 0.5 0.2; 12 0.2 0.3 0.5] 13 14 % 观察矩阵(发射矩阵) 15 B=[ 0.5 0.5; 16 0.4 0.6; 17 0.7 0.3] 18

【机器学习算法-python实现】采样算法的简单实现

1.背景 采样算法是机器学习中比较常用,也比较容易实现的(出去分层采样).常用的采样算法有以下几种(来自百度知道): 一.单纯随机抽样(simple random sampling) 将调查总体全部观察单位编号,再用抽签法或随机数字表随机抽取部分观察单位组成样本. 优点:操作简单,均数.率及相应的标准误计算简单. 缺点:总体较大时,难以一一编号. 二.系统抽样(systematic sampling) 又称机械抽样.等距抽样,即先将总体的观察单位按某一顺序号分成n个部分,再从第一部分随机抽取第k

【机器学习算法-python实现】矩阵去噪以及归一化

1.背景 项目需要,打算用python实现矩阵的去噪和归一化.用numpy这些数学库没有找到很理想的函数,所以一怒之下自己用标准库写了一个去噪和归一化的算法,效率有点低,不过还能用,大家如果有需要可以拿去. (1)去噪算法:根据概率论的知识,如果一组数据服从正态分布,我们设均值是n,方差是v,那么对于每个离散数值有百分之九十二以上的概率会在(n-3*v,n+3*v)的区间内.所以这里的去噪功能主要是实现如果超出了区间就将这个值标记为区间所能容忍最大值. (2)归一化:找到输入队列最大值max,最

【机器学习算法-python实现】协同过滤(cf)的三种方法实现

(转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景 协同过滤(collaborative filtering)是推荐系统常用的一种方法.cf的主要思想就是找出物品相似度高的归为一类进行推荐.cf又分为icf和ucf.icf指的是item collaborative filtering,是将商品进行分析推荐.同理ucf的u指的是user,他是找出知趣相似的人,进行推荐.通常来讲icf的准确率可能会高一些,通过这次参加天猫大数据比赛,我觉得只有在数据量非

HMM条件下的 前向算法 和 维特比解码

一.隐马尔科夫HMM假设: 有且只有3种天气:0晴天,1阴天,2雨天 各种天气间的隔天转化概率mp: mp[3][3] 晴天 阴天 雨天 晴天 0.33333 0.33333 0.33333 阴天 0.33333 0.33333 0.33333 雨天 0.33333 0.33333 0.33333 有2种活动:            0去公园,1不去公园 各种天气下进行各种活动的概率: w2a[3][2] 去公园 不去公园 晴天 0.75 0.25 阴天 0.4 0.6 雨天 0.25 0.75

【机器学习算法-python实现】svm支持向量机(2)—简化版SMO算法

(转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景知识 通过上一节我们通过引入拉格朗日乗子得到支持向量机变形公式.详细变法可以参考这位大神的博客--地址 参照拉格朗日公式F(x1,x2,...λ)=f(x1,x2,...)-λg(x1,x2...).我们把上面的式子变型为: 约束条件就变成了: 下面就根据最小优化算法SMO(Sequential Minimal Optimization).找出距离分隔面最近的点,也就是支持向量集.如下图的蓝色点所示.