马尔科夫系列——三、隐马尔可夫模型 - 学习问题 - Baum-Welch算法

    转载的过程中发现,原文有些地方不太理解,就阅读了其他的文章,然后把代码的实现也引进来了。之前并没有验证代码的准确性,后面有人说,代码可能有问题,我尝试了修改。把简单修改版本的也放上来。

目录

一、训练数据包含观测序列和状态序列

1、初始概率的计算

2、转移概率的计算

3、发射概率

二、训练数据中只有观测序列

Baum-Welch算法 - π求解

Baum-Welch算法 - A求解

Baum-Welch算法 - B求解

代码实现


若训练数据包含观测序列和状态序列,则HMM的学习问题非常简单,是监督学习算法。
若训练数据只包含观测序列,则HMM的学习问题需要使用EM算法求解,是非监督学习算法。

一、训练数据包含观测序列和状态序列

直接利用大数定理的结论“频率的极限是概率”,直接给出HMM的参数估计

下面一一给出解释和说明。

1、初始概率的计算

公式中|Si| : Si的个数,表示状态i的总个数;∑|Si|:表示所有时间点上的状态个数。举例如下图:

2、转移概率的计算

公式中aij 表示i号状态转移到j号状态的概率;|Sij| 表示i号状态转移到j号状态的个数;∑|Sij| 表示所有时间点上i号状态转移到j号状态的个数。举例如下图所示:

注意上图中的公式有点小问题,分母中的求和符号和sij中的j应该修改为其他的字母——如K,这样才没有歧义。

3、发射概率

bij 从当前状态转移到某个观测值的个数。
比如从1号盒子这个状态,转移到取出白球这个观测值的可能性 = b1白;
b1白 = (1->白)的个数 / [(1->白)的个数+(1->黑)的个数]

同样的它的公式中分母中的求和符号和qij中的J应该修改为其他的字母——如k,这样才更好理解。

二、训练数据中只有观测序列

只有观测序列,没有状态序列,这个时候就得采用Baum-Welch算法。本文中的Baum-Welch算法解释写的不是很详细,具体的推导和实现需要参考别的博客——隐马尔可夫模型之Baum-Welch算法详解和”相亲记“之从EM算法到Baum-Welch算法。在Baum-Welch算法的推导过程中需要用到EM算法的原理HMM概率问题中的前向和后向算法结论。

根据EM算法的E步:得到Q函数,然后对Q函数极大化,

 

Baum-Welch算法 - π求解

极大化L,使用拉格朗日乘子法,求解π的值:

Baum-Welch算法 - A求解

极大化L,使用拉格朗日乘子法,求解aij的值:

Baum-Welch算法 - B求解

极大化L,使用拉格朗日乘子法,求解bij的值:

Baum-Welch算法 - 极大化L函数,分别可以求得π、a、b的值

其中:

这里写图片描述

这里写图片描述

代码实现

来自这篇博文:”相亲记“之从EM算法到Baum-Welch算法,理解代码可以配合博文大学食堂之HMM模型(三)——Baum-Walch算法来进行——我还没有来得及去验证这个代码,以后有机会在验证,先把HMM的理论理解了进入CRF中,CRF才是最重要的,目前对我来说!

#!/usr/bin/env python  
# -*- coding:utf-8 -*-  
import numpy'''
Created on 2017年2月9日@author: 薛沛雷
'''class HMM:def __init__(self,A,B,Pi):self.A=Aself.B=Bself.Pi=Pi#前向算法def forward(self,O):row=self.A.shape[0]col=len(O)alpha=numpy.zeros((row,col))#初值alpha[:,0]=self.Pi*self.B[:,O[0]]#递推for t in range(1,col):for i in range(row):alpha[i,t]=numpy.dot(alpha[:,t-1],self.A[:,i])*self.B[i,O[t]]#终止return alpha#后向算法def backward(self,O):row=self.A.shape[0]col=len(O)beta=numpy.zeros((row,col))#初值beta[:,-1:]=1#递推for t in reversed(range(col-1)):for i in range(row):beta[i,t]=numpy.sum(self.A[i,:]*self.B[:,O[t+1]]*beta[:,t+1])#终止return beta#前向-后向算法(Baum-Welch算法):由 EM算法 & HMM 结合形成def baum_welch(self,O,e=0.05):row=self.A.shape[0]col=len(O)done=Falsewhile not done:zeta=numpy.zeros((row,row,col-1))alpha=self.forward(O)beta=self.backward(O)#EM算法:由 E-步骤 和 M-步骤 组成#E-步骤:计算期望值zeta和gammafor t in range(col-1):#分母部分denominator=numpy.dot(numpy.dot(alpha[:,t],self.A)*self.B[:,O[t+1]],beta[:,t+1])for i in range(row):#分子部分以及zeta的值numerator=alpha[i,t]*self.A[i,:]*self.B[:,O[t+1]]*beta[:,t+1]zeta[i,:,t]=numerator/denominatorgamma=numpy.sum(zeta,axis=1)final_numerator=(alpha[:,col-1]*beta[:,col-1]).reshape(-1,1)final=final_numerator/numpy.sum(final_numerator)gamma=numpy.hstack((gamma,final))#M-步骤:重新估计参数Pi,A,BnewPi=gamma[:,0]newA=numpy.sum(zeta,axis=2)/numpy.sum(gamma[:,:-1],axis=1)newB=numpy.copy(self.B)b_denominator=numpy.sum(gamma,axis=1)temp_matrix=numpy.zeros((1,len(O)))for k in range(self.B.shape[1]):for t in range(len(O)):if O[t]==k:temp_matrix[0][t]=1newB[:,k]=numpy.sum(gamma*temp_matrix,axis=1)/b_denominator#终止阀值if numpy.max(abs(self.Pi-newPi))<e and numpy.max(abs(self.A-newA))<e and numpy.max(abs(self.B-newB))<e:done=True self.A=newAself.B=newBself.Pi=newPireturn self.Pi#将字典转化为矩阵
def matrix(X,index1,index2):#初始化为0矩阵m = numpy.zeros((len(index1),len(index2)))for row in X:for col in X[row]:#转化m[index1.index(row)][index2.index(col)]=X[row][col]return mif __name__ == "__main__":  #初始化,随机的给参数A,B,Pi赋值status=["相处","拜拜"]observations=["撒娇","低头玩儿手机","眼神很友好","主动留下联系方式"] #撒娇:小拳拳捶你胸口A={"相处":{"相处":0.5,"拜拜":0.5},"拜拜":{"相处":0.5,"拜拜":0.5}}B={"相处":{"撒娇":0.4,"低头玩儿手机":0.1,"眼神很友好":0.3,"主动留下联系方式":0.2},"拜拜":{"撒娇":0.1,"低头玩儿手机":0.5,"眼神很友好":0.2,"主动留下联系方式":0.2}}Pi=[0.5,0.5]O=[1,2,0,2,3,0]A=matrix(A,status,status)B=matrix(B,status,observations)hmm=HMM(A,B,Pi)print(hmm.baum_welch(O))

以上代码,最后的结果中P的概率之和为1.A的和B的每行概率之和明显不是1,这里可能就有点问题了。我做了简单的修改,只是修改了一句代码,PAB的各自概率之和差不多都近似为1了。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import numpy
import numpy as np'''
Created on 2020-04-18
@author: HY
'''class HMM:def __init__(self, A, B, Pi):self.A = Aself.B = Bself.Pi = Pi# 前向算法def forward(self, O):row = self.A.shape[0]col = len(O)alpha = numpy.zeros((row, col))# 初值alpha[:, 0] = self.Pi * self.B[:, O[0]]# 递推for t in range(1, col):for i in range(row):alpha[i, t] = numpy.dot(alpha[:, t - 1], self.A[:, i]) * self.B[i, O[t]]# 终止return alpha# 后向算法def backward(self, O):row = self.A.shape[0]col = len(O)beta = numpy.zeros((row, col))# 初值beta[:, -1:] = 1# 递推for t in reversed(range(col - 1)):for i in range(row):# beta[i, t] = numpy.sum(self.A[i, :] * self.B[:, O[t + 1]] * beta[:, t + 1])beta[i, t] = numpy.dot(beta[:, t + 1],self.A[i,:])* self.B[i,O[t + 1]]# 终止return beta# 前向-后向算法(Baum-Welch算法):由 EM算法 & HMM 结合形成def baum_welch(self, observations, criterion=0.05):n_states = self.A.shape[0]# 观察序列的长度Tn_samples = len(observations)done = Falsewhile not done:# alpha_t(i) = P(o_1,o_2,...,o_t,q_t = s_i | hmm)# Initialize alpha# 获得所有前向传播节点值 alpha_t(i)alpha = self.forward(observations)# beta_t(i) = P(o_t+1,o_t+2,...,o_T | q_t = s_i , hmm)# Initialize beta# 获得所有后向传播节点值 beta_t(i)beta = self.backward(observations)# 计算 xi_t(i,j) -> xi(i,j,t)xi = np.zeros((n_states, n_states, n_samples - 1))# 在每个时刻for t in range(n_samples - 1):# 计算P(O | hmm)denom = sum(alpha[:, -1])for i in range(n_states):# numer[1,:] = 行向量,alpha[i,t]=实数,slef.A[i,:] = 行向量# self.B[:,observations[t+1]].T = 行向量,beta[:,t+1].T = 行向量numer = alpha[i, t] * self.A[i, :] * self.B[:, observations[t + 1]].T * beta[:, t + 1].Txi[i, :, t] = numer / denom# 计算gamma_t(i) 就是对j进行求和gamma = np.sum(xi, axis=1)# need final gamma elements for new Bprod = (alpha[:, n_samples - 1] * beta[:, n_samples - 1]).reshape((-1, 1))# 合并T时刻的节点gamma = np.hstack((gamma, prod / np.sum(prod)))# 列向量newpi = gamma[:, 0]newA = np.sum(xi, 2) / np.sum(gamma[:, :-1], axis=1).reshape((-1, 1))newB = np.copy(self.B)# 观测状态num_levels = self.B.shape[1]sumgamma = np.sum(gamma, axis=1)temp_matrix = numpy.zeros((1, len(observations)))for lev in range(num_levels):for t in range(len(observations)):if observations[t]== lev:temp_matrix[0][t] = 1newB[:, lev] = np.sum(gamma*temp_matrix, axis=1) / sumgammatemp_matrix = numpy.zeros((1, len(observations)))if np.max(abs(self.Pi - newpi)) < criterion and np.max(abs(self.A - newA)) < criterion and np.max(abs(self.B - newB)) < criterion:done = 1self.A[:], self.B[:], self.Pi = newA, newB, newpireturn self.Pi, self.A, self.B# 将字典转化为矩阵
def matrix(X, index1, index2):# 初始化为0矩阵m = numpy.zeros((len(index1), len(index2)))for row in X:for col in X[row]:# 转化m[index1.index(row)][index2.index(col)] = X[row][col]return mif __name__ == "__main__":# 初始化,随机的给参数A,B,Pi赋值status = ["相处", "拜拜"]observations = ["撒娇", "低头玩儿手机", "眼神很友好", "主动留下联系方式"]  # 撒娇:小拳拳捶你胸口A = {"相处": {"相处": 0.5, "拜拜": 0.5}, "拜拜": {"相处": 0.5, "拜拜": 0.5}}B = {"相处": {"撒娇": 0.4, "低头玩儿手机": 0.1, "眼神很友好": 0.3, "主动留下联系方式": 0.2},"拜拜": {"撒娇": 0.1, "低头玩儿手机": 0.5, "眼神很友好": 0.2, "主动留下联系方式": 0.2}}Pi = [0.5, 0.5]Ob = [1,2,0,2,3,0]A = matrix(A, status, status)B = matrix(B, status, observations)hmm = HMM(A, B, Pi)p = hmm.baum_welch(Ob)[0]a = hmm.baum_welch(Ob)[1]b = hmm.baum_welch(Ob)[2]print('p:',p)print('a:',a)print('b:',b)

最后的结果:

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/34427.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

马尔可夫链蒙特卡洛(MCMC)在python中的实战案例应用

最近由于工作繁忙&#xff0c;博客更新较慢&#xff0c;所以请大家见谅&#xff01;pymc是一个做贝叶斯分析的python库&#xff0c;我之前的博客中已经介绍了pymc的使用方法&#xff0c;今天再给大家做个更详细的应用案例介绍。该案例来自于github&#xff0c;我将其代码稍微修…

马尔可夫蒙特卡洛(MCMC)附python代码

马尔可夫蒙特卡洛&#xff08;MCMC&#xff09; 1.马尔可夫链(Markov Chain) 随机过程是一组随机变量 X t X_t Xt​的集合&#xff0c; t t t为整数的时候&#xff0c;就是离散随机过程。马尔可夫过程是指一个满足马尔可夫性质的随机过程。马尔可夫性质是指: P ( X t 1 ∣ X…

隐马尔可夫模型在map-matching中的应用

该要 Map-matching是指将手机gps上报的轨迹点&#xff08;经纬度&#xff09;映射到路网上。由于精度问题&#xff0c;上报的轨迹点通常和实际位置有所偏差&#xff0c;因此产生了很多算法进行绑路&#xff0c;其中效果最好的是hmm&#xff08;隐马尔可夫模型&#xff09;的应…

隐马尔可夫模型HMM+维特比算法(Viterbi Algorithm)进行词性标注代码实现(自然语言处理课程第二次作业)

文章目录 一、理论描述二、算法描述三、详例描述具体过程分析题目数据预处理转移概率矩阵&#xff1a;发射概率矩阵&#xff1a; HMM维特比算法进行词性标注开始进行词性标注&#xff1a;The&#xff1a;bear&#xff1a;is&#xff1a;on&#xff1a;the&#xff1a;move&…

海尔计算机无法装win7系统,海尔Haier电脑预装win8换win7系统BIOS设置及安装教程

现在市场很多笔记本或一体机电脑都是预装win8或win8.1操作系统&#xff0c;但很多用户还是比较习惯使用Win7或xp操作系统&#xff0c;所以会在预装的win8系统上安装自己所习惯的操作系统&#xff0c;一般情况要更换预装的系统是要对BIOS进行设置的&#xff0c;在不同品牌的电脑…

海尔微型计算机硬盘如何拆卸,海尔a62的详细拆机步骤【图文教程】

随着社会的不断发展&#xff0c;台式电脑已经无法满足市场的需求了&#xff0c;现在 笔记本电脑 非常地流行&#xff0c;它以轻薄的机身和过高的配置赢得了很多顾客的喜爱&#xff0c;所以市场上也出现了各种品牌的笔记本电脑。大家知道吧&#xff0c;任何东西都是优势互补的&a…

海尔计算机无法装win7系统,海尔品牌机win10改win7系统教程

近期有朋友向小编反映说&#xff0c;最近想将海尔品牌机预装的win10系统改成win7的&#xff0c;但是每次ghost完系统后&#xff0c;总是启动不开&#xff0c;这是怎么回事呢&#xff1f;这一般是bios的设置不对&#xff0c;这里小编就来给大家介绍一下海尔品牌机怎么将win10改成…

海尔android 电视直播软件,海尔智能电视如何安装直播软件看直播

嗨&#xff0c;大家好&#xff0c;今天我来给大家简单介绍一下智能电视怎么安装第三方软件&#xff1f;买了智能电视&#xff0c;很多用户 都会发现它不能像传统电视一样去看直播电视。这个时候我们就需要去安装第三方软件去解决。 一般来说&#xff0c;在智能电视里面&#xf…

海尔微型计算机U盘启动,海尔台式电脑如何bios设置u盘启动教程

许多用户打算使用u盘给海尔台式电脑装系统&#xff0c;但在操作过程中发现不会设置u盘启动&#xff0c;其实只要了解清楚&#xff0c;掌握海尔台式电脑bios设置u盘为第一启动项的方法很是简单&#xff0c;今天快启动小编就为大家分享下详细操作教程把。 海尔台式电脑从u盘启动有…

海尔云悦2db微型计算机,家庭主机新选择 海尔云悦mini2首发评测

1海尔云悦mini2评测前言 虽然家用台式机的市场份额一直持续下滑,以至于业界很多人认为台式机已经退出历史舞台,被笔记本、一体电脑所代替。但是,笔者要在这里为台式机正音,台式机依然是很多用户的选择,并且台式机体积越来越小,功能越来越多。甚至,台式机开始进军客厅战场…

海尔电视android怎么设置,海尔电视怎么连接手机 海尔电视连接手机步骤

随着电视发展越来越迅速&#xff0c;电视的更新换代也是非常越来越快。而如今电视也变得越来越智能化了。它不但可以看电视&#xff0c;还可以连接网络&#xff0c;连接手机的。而电视行业品牌也是非常的多的。而对于电视老品牌 海尔 &#xff0c;它们的产品也是非常优秀的。并…

海尔电视 android,海尔电视遥控器

海尔电视遥控器手机版是一款多功能智能电视控制软件。海尔电视遥控器app支持多种手机品牌&#xff0c;通过与手机连接之后&#xff0c;手机就变成了遥控器&#xff0c;使用更方便&#xff01; 软件介绍 海尔电视遥控器app全面支持多品牌手机&#xff0c;没有网络也能轻松遥控电…

海尔电视 android,海尔电视怎么投屏

导言&#xff1a;你知道海尔电视怎么投屏吗&#xff1f; 摘要&#xff1a;海尔是当前国内非常受欢迎的品牌&#xff0c;在当下飞速发展的时代&#xff0c;海尔电视也与时俱进。现在的海尔电视不仅仅只限于观看&#xff0c;还可以连接手机&#xff0c;更可以电视投屏。那你知道海…

海尔微型台式计算机重装系统,海尔台式电脑bios设置u盘启动教程

海尔是全国知名品牌&#xff0c;相信用户朋友们多少都有点了解海尔这个老品牌&#xff0c;可是最近有用户想用u盘给海尔电脑重装系统,但是不知道海尔电脑bios设置u盘启动方法&#xff0c;其实海尔台式电脑bios设置启动项很简单,装机吧小编写了一份海尔台式机bios设置u盘启动的方…

海尔台式计算机配置,海尔台式机bios设置图解方法

海尔是全国知名品牌&#xff0c;相信用户朋友们多少都有点了解海尔这个老品牌&#xff0c;可是最近有用户想用u盘给海尔电脑重装系统,但是不知道海尔电脑bios设置u盘启动方法&#xff0c;其实海尔台式电脑bios设置启动项很简单,接下来是小编为大家收集的海尔台式机bios设置图解…

海尔电视显示连接不上服务器,海尔电视怎么连接手机

导言&#xff1a;你知道海尔电视怎么连接手机吗&#xff1f; 摘要&#xff1a;随着互联网科技的飞速发展&#xff0c;智能化已普遍运用到人们的生活中。电视产业也随着科技的发展飞速成长&#xff0c;变得越来越智能化。不但可以看电视&#xff0c;还可以连接网络、连接手机&am…

海尔微型计算机机箱如何拆解,海尔t628拆机详解

电脑在我们这个时代已经是我们生活的必需品了,不管是在家里的生活方面还是在工作方面,电脑都能给我们带来极大的帮助。可是电脑毕竟只是一部机器,机器就避免不了出现问题的时候,有一些小问题我们又不想拿到外面去给别人修,可是自己动手又怕把电脑给弄坏了,这真是一个很尴…

新书上市|一位家长的忠告:长大后不成才的孩子,父母都忽视了这个点!

不能因为孩子好像没有才能而早早放弃&#xff0c;而是应该精心养育。我相信&#xff0c;从“培养各方面都很均衡的人”的角度来看&#xff0c;这才是教育的出发点。 并非所有才能都是与生倶来的。不过&#xff0c;遗传确实会有所影响。 调查遗传影响的传统方法是双生子研究。该…

教育 - 幼儿教育

幼儿教育 教育参考资源品牌简介BBunion金宝贝美吉姆红黄蓝小马快跑七田真积木宝贝东方爱婴亲亲袋鼠运动宝贝蒙特梭利 教育参考资源 上海学前教育网 品牌简介 BBunion 简介 &#xff08;1&#xff09;0-3岁 性格教育品牌&#xff0c;沿用德国、犹太人早期家庭教育智慧 &…

[ZT]精彩的国外育儿教育读本,图文并茂

真是太有趣了&#xff01;外國人對新爸新媽的育兒教育如此圖文並茂&#xff0c;相比之下&#xff0c;中國人的古板和拘謹顯得更加乏味與無趣&#xff0c;看看吧&#xff0c;真是寓教於樂的好東西。 測試奶水溫度 讓寶寶安靜下來 抱起寶寶 看小寶寶尿褲是干還是濕 包裹小寶寶 真…