14.1 隐马尔可夫模型

隐马尔科夫模型(HMM)及Viterbi算法实现
隐马尔科夫模型通过给定观察序列,预测隐藏序列,常用于需要从序列的表面信息挖掘隐藏信息的任务,例如语音识别、手写识别。原则上,隐马尔科夫模型还可进行诸如词性标注、中文分词等任务,但由于混淆矩阵的高宽同时由观察序列的种类数量决定,当运用到大型语料库时,词集的大小动辄上万,则混淆矩阵需要存储上亿的参数,对计算机而言不论是运行次数还是内存占用都是灾难性的;同时,隐马尔科夫模型的一大假设是,当前时间步长的隐状态只和当前时刻的显状态以及上一时刻的隐状态相关,而实际情况是,词语的含义和标注形式同时受上下文多个词语的影响,因此,隐马尔科夫模型在该类 NLP 任务上被迅速淘汰,机会转让给条件随机场等破除该时间依赖关系假设的模型。

Viterbi 算法在动态规划领域用于寻求最大概率路径。隐马尔科夫模型对当前时间步长某一类隐状态的预测实际上是基于将上一时刻隐状态进行转移后,加总所有可能性而得出的;Viterbi 算法对该思路进行调整,将上一时刻隐状态进行转移后,仅取其中概率最大的路径。如下图所示:

import numpy as np
class HMM(object):'''算法原理:- 训练依据统计学条件分布原理生成隐状态边缘分布、转移矩阵以及混淆矩阵- 预测i.将全局隐状态概率分布与混淆矩阵中显状态对应的列相乘预测初始时刻隐状态分布ii.进入下一个时间步长,将上一时刻的隐状态分布与转移矩阵相乘iii.将相乘的结果与混淆矩阵中该时刻显状态对应的列相乘预测该时刻隐状态分布iii.循环第ii、iii步.- 预测(Viterbi)i.将全局隐状态概率分布与混淆矩阵中显状态对应的列相乘预测初始时刻隐状态分布ii.进入下一个时间步长,将上一时刻的隐状态分布与转移矩阵中的元素相乘,取最大值iii.将最大概率序列与混淆矩阵中该时刻显状态对应的列相乘预测该时刻隐状态分布iii.循环第ii、iii步.'''def __init__(self):self.train = None    #训练集显状态序列self.label = None    #训练集隐状态序列self.prob = None    #全局隐状态边缘分布self.trans = None    #转移矩阵(row:T时刻隐状态 col:T+1时刻隐状态)self.emit = None    #发射(混淆)矩阵(row:隐状态 col:显状态)def fit(self,train,label):'''导入训练集,生成全局隐状态边缘分布、转移矩阵以及混淆矩阵'''assert isinstance(train,list)assert isinstance(label,list)assert len(train) == len(label)self.train = trainself.label = labelself.cal_prob()self.cal_trans()self.cal_emit()def cal_prob(self):'''生成全局隐状态边缘分布'''prob = np.zeros(max(self.label)+1)for y in set(self.label):prob[y] += float(self.label.count(y)/len(self.label))self.prob = np.mat(prob)def cal_trans(self):'''生成转移矩阵'''trans = np.zeros((len(set(self.label)),len(set(self.label))))last = self.label[0]for y in self.label[1:]:trans[last,y] += 1last = yself.trans = np.mat([row/row.sum() for row in trans])def cal_emit(self):'''生成发射(混淆)矩阵'''emit = np.zeros((len(set(self.label)),len(set(self.train))))for x,y in zip(self.train,self.label):emit[y,x] += 1self.emit = np.mat([row/row.sum() for row in emit])def predict(self,test):'''依据显状态预测隐状态序列'''assert isinstance(test,list)assert len(set(test)-set(np.arange(self.emit.shape[1]))) == 0seq = []for t in range(len(test)):if t == 0:pred = np.multiply(self.prob,self.emit[:,test[t]].T)    #预测初始时刻隐状态else:pred = np.multiply(pred*self.trans,self.emit[:,test[t]].T)    #预测T时刻隐状态pred = pred/(pred.sum()+1e-12)    #防止计算下限溢出seq.append(pred.argmax())return seqdef viterbi_predict(self,test):'''Viterbi算法调整'''assert isinstance(test,list)assert len(set(test)-set(np.arange(self.emit.shape[1]))) == 0seq = []for t in range(len(test)):if t == 0:pred = np.multiply(self.prob,self.emit[:,test[t]].T)    #预测初始时刻隐状态else:pred = np.mat([(pred[0,y]*self.trans[:,y]).max() for y in range(pred.shape[1])])    #在原模型上添加此行pred = np.multiply(pred,self.emit[:,test[t]].T)    #预测T时刻隐状态pred = pred/(pred.sum()+1e-12)    #防止计算下限溢出t+=1seq.append(pred.argmax())return seq
if __name__ == '__main__':train = [0,5,2,6,4,3,2,0,5,1,5,1,2,5,2,0,2,0,2,3,6,4,6,4,2,5,1,0,2,5]label = [1,0,2,1,2,1,2,2,0,2,0,1,0,0,2,1,1,2,2,0,1,2,0,2,1,2,0,0,0,1]test = [0,2,3,6,3,1,1,2,2,5,1,5,4,2,3,6,2,5,0,5,2]model = HMM()model.fit(train,label)    #模型训练print('Prediction result (original): %s'%model.predict(test))    #模型预测print('Prediction result (Viterbi): %s'%model.viterbi_predict(test))    #模型预测(Viterbi)


14.2 马尔可夫随机场

马尔可夫随机场(Markov Random Field,简称MRF)是典型的马尔可夫网,这是一种著名的无相图模型。图中每个节点表示一个或一组变量,节点之间的边表示两个变量之间的依赖关系。马尔可夫随机场有一组势函数(potential functions),亦称“因子”(factor),这是定义在变量子集上的非负实函数,主要用于定义概率分布函数。
一个简单的马尔可夫随机场

14.3 条件随机场
CRF即条件随机场(Conditional Random Fields),是在给定一组输入随机变量条件下另外一组输出随机变量的条件概率分布模型,它是一种判别式的概率无向图模型,既然是判别式,那就是对条件概率分布建模。

CRF较多用在自然语言处理和图像处理领域,在NLP中,它是用于标注和划分序列数据的概率化模型,根据CRF的定义,相对序列就是给定观测序列X和输出序列Y,然后通过定义条件概率P(Y|X)来描述模型。

CRF的输出随机变量假设是一个无向图模型或者马尔科夫随机场,而输入随机变量作为条件不假设为马尔科夫随机场,CRF的图模型结构理论上可以任意给定,但我们常见的是定义在线性链上的特殊的条件随机场,称为线性链条件随机场。

14.4 学习与推断

14.5 近似推断

14.6 话题模型
1、LDA数学定义

1)话题模型:传统的文本分类器,比如贝叶斯、kNN和SVM,只能将其分到一个确定的类别中。假设我给出3个分类“算法”“分词”“文学”让其判断,如果某个分类器将该文归入算法类,我觉得还凑合,如果分入分词,那我觉得这个分类器不够准确。

假设一个文艺小青年来看我的博客,他完全不懂算法和分词,自然也给不出具体的备选类别,有没有一种模型能够告诉这个白痴,这篇文章很可能(80%)是在讲算法,也可能(19%)是在讲分词,几乎不可能(1%)是在讲其它主题呢?

有,这样的模型就是话题模型。

机器学习(MACHINE LEARNING) 【周志华版-”西瓜书“-笔记】 DAY14-概率图模型相关推荐

  1. 机器学习(MACHINE LEARNING) 【周志华版-”西瓜书“-笔记】 DAY11-特征选择和稀疏学习

    特征工程是机器学习中非常重要的一个环节,它的好坏直接影响了机器学习效果的优劣.而特征工程里非常关键的一步就是特征选择. 如果把机器学习比作是一个厨师做菜的过程,那么数据就是原材料(菜),模型可以理解为 ...

  2. 机器学习(MACHINE LEARNING) 【周志华版-”西瓜书“-笔记】 DAY1-绪论

    我太喜欢这本书了 ,因为封面很好看 .PS:划重点是教科书!需要一定基础,京东正版有售~ 1.1 引言 机器学习:例如我们人吃过,看过很多西瓜, 所以基于色泽.根蒂,敲声这几个特征我们就可以做出相当好 ...

  3. 机器学习(MACHINE LEARNING) 【周志华版-”西瓜书“-笔记】 DAY16-强化学习

    文章目录 16.1 任务与奖赏 RL与有监督学习.无监督学习的比较 形象举例 16.2 K-摇臂赌博机 ε-贪心算法 16.3 有模型学习 16.4 免模型学习 16.5 值函数近似 16.6 模仿学 ...

  4. 机器学习(MACHINE LEARNING) 【周志华版-”西瓜书“-笔记】 DAY4-决策树

    4.1 基本流程 决策树(decision)是一类常见的机器学习算法,以二分类任务为例,我们希望从给定训练数据集学得一个模型用以对新示例进行分类,这个把样本分类的任务,可看做对"当前样本属于 ...

  5. 机器学习(MACHINE LEARNING) 【周志华版-”西瓜书“-笔记】 DAY15-规则学习

    15.1.规则学习 "规则学习" (rule learning)是从训练数据中学习出一组能用于对未见示例进行判别的规则. 形式上一般为: 式子中,右边的部分称为规则体(Body), ...

  6. 机器学习(MACHINE LEARNING) 【周志华版-”西瓜书“-笔记】 DAY13-半监督学习

    13.1 未标记样本 先说两个概念: 1)有标记样本(Labeled) 训练样本集Dl={(x1,y1), (x2,y2),-, (xl,yl)},这l个样本的类别标记已知. 2)未标记样本(unla ...

  7. 机器学习(MACHINE LEARNING) 【周志华版-”西瓜书“-笔记】 DAY10-降维和度量学习

    10.1 k近邻学习 k近邻(k-Nearest Neighbor,简称kNN)学习是一种常用的监督学习方法. 二.近邻分类算法 1.近邻分类算法的概念 在近邻分类算法中,对于预测的数据,将其与训练样 ...

  8. 机器学习(MACHINE LEARNING) 【周志华版-”西瓜书“-笔记】 DAY6-支持向量机

    今日份打卡~ 一定要读到最后啊,越往后越干货.@!@ 6.1 间隔与支持向量机 6.2 对偶问题 SMO Platt的SMO算法是将大优化问题分解为许多小优化问题求解的,并且对它们顺序求解的结果与将它 ...

  9. 机器学习(MACHINE LEARNING) 【周志华版-”西瓜书“-笔记】 DAY3-线性模型

    3.1 基本形式 一般用向量形式写成 本文介绍几种经典的线性模型,看我们先从回归任务开始,然后讨论二分类和多分类任务. 3.2 线性回归 线性回归是一种监督学习下的线性模型,线性回归试图从给定数据集中 ...

  10. 机器学习(MACHINE LEARNING) 【周志华版-”西瓜书“-笔记】 DAY2-模型评估与选择

    2.1经验误差与过拟合 学习器在训练集上的误差称为"训练误差"(training error)或"经验误差". 当学习器把训练样本学得"太好" ...

最新文章

  1. javascript学习之基本概念
  2. 如何创建修改分区表和如何查看分区表
  3. 05-iOS蓝牙开发总结
  4. 机器学习实战(十)利用K-means算法对未标注数据分组
  5. 【安卓开发 】Android初级开发(十)Android中app自动更新版本号比较
  6. TabError: inconsistent use of tabs and spaces in indentation
  7. java jython_将对象从Java传递到Jython时保留Java类型
  8. python email模块详解_Python使用email模块对邮件进行编码和解码的实例教程
  9. 电子书管理神器 calibre 5.0.0中文版
  10. Linux下source命令详解
  11. 六分解谜四分温情,浅谈《像素小屋》倍受新手解谜者的青睐的原因
  12. lpad()函数oracle,oracle 中lpad的用法
  13. KTV评分系统实现总结
  14. (每日一练c++)CC113 数独
  15. MySql now函数
  16. Node.js文档和教程
  17. Embedding Cardinality Constraints in Neural Link Predictors (SAC 2019)
  18. 【Python】音乐可视化播放器(PyQt5 + matplotlib.animation)
  19. 二进制安装Kubernetes 高可用集群
  20. 配置超过64K方法的应用程序

热门文章

  1. pytorch 自定义参数不更新
  2. sys no attribute argv
  3. asyncio 回调
  4. ubuntu16.04安装英伟达(NVIDIA)驱动——run文件安装
  5. numpy.ravel() vs numpy.flatten()
  6. oculus ios学习资料整理
  7. 十二、Redis五大数据类型之四Hash
  8. mysql实习生笔试题_2014阿里实习生面试题MySQL如何实现索引的
  9. 速计算机科学,计算机科学速成课30:万维网【视频】
  10. Python3搭建Django框架浅析