文档章节

隐马尔科夫和最大熵马尔科夫

Digimon
 Digimon
发布于 2017/08/04 21:23
字数 1408
阅读 47
收藏 0
点赞 0
评论 0

隐马尔科夫实现:

前文链接:https://my.oschina.net/u/3268732/blog/1480198

如前文的说法,隐马尔科夫相关的有两个式子: 隐马式子 对两个式子就可以建立矩阵A,矩阵B。矩阵A是S之间的转换,为NN,N为标签个数,矩阵中的值为当前标签转移至下一标签的概率。矩阵B是S与O之间的转化,为NM,M为O的可能状态,实际上就是在求每个状态下转移的概率。模型中还有一个值π,寓意为每个标签出现的可能性。

下面对一个解码问题进行说明:

解码问题用维特比算法,可应用与文本信息抽取,还有什么基因检测,蛋白质二级序列啥的……解码问题有很多优化,如CRF等,真实工程中就不会用这种原始的了……。对于序列上的每一个元素,其转换可能为标签里的任意一种,同时,他被下一元素限制,因为下一元素也是一种转化的表现。所以大体思路就是先算所有词的转化标签概率(记得考虑自身和上一词两种情况),形成一个树状结构。(图示如李航《统计学习方法》P186)这个时候就是递推,一直推完。然后只需在这所有的路径里找到最优的方案,也就是所有概率最优的情况。

第一步:构建一个模型:

这一步直接就是对训练数据进行统计就完了

第二步:进行维特比算法:

算法:

v1 v2 代码:

#统计a,pi
def HMMA():
    for i in range(len(label)):
        #初始化计数
        countp=[]
        s=0
        for j in range(len(label)):
            countp.append(0)
        for j in range(trainlen-1):
            if(trainos[j+1]==label[i]):
                s+=1
                countp[label.index(trainos[j])]+=1
        for j in range(len(label)):
            if(s!=0):a[i].append(countp[j]/s)
            else:a[i].append(0)
        #初始初始矩阵
        pi.append(s/trainlen)
    global b
    b=proyx

#统计b
def HMMB():
    count=[]
    for i in range(len(label)):
        countall=0
        for j in range(len(trainx)):
            count.append(0)
        for j in range(trainlen):
            if(trainos[j]==label[i]):
                countall+=1
                count[trainxx.index(trainsq[j])]+=1
        for j in range(len(trainxx)):
            hmmb[i].append(count[j]/countall)
        count=[]

#维特比
def viterbi(testsq,testos,b):
    delta = [[]for i in range(len(testsq))]
    fai = [[]for i in range(len(testsq))]
    #初始化
    if(len(testsq)==0):return
    for i in range(len(label)):
        if(testsq[0])in trainxx:
            delta[0].append(pi[i]*b[i][trainxx.index(testsq[0])]*bigger)
        else:
            delta[0].append(0)
        fai[0].append(0)
    for j in range(1,len(testsq)):
        for i in range(len(label)):
            if(testsq[j]) in trainxx:
                maxtmp=-1
                max_i=0
                for k in range(len(label)):
                    if(delta[j-1][k]*a[i][k]>maxtmp):
                        maxtmp=delta[j-1][k]*a[i][k]
                        max_i=k
                delta[j].append(maxtmp*b[i][trainxx.index(testsq[j])])
                fai[j].append(max_i)
            else:
                delta[j].append(0)
                fai[j].append(0)
    maxtmp=0
    max_i=0
    mytestchoic=[]
    mytestos=[]
    for i in range(len(label)):
        if maxtmp<delta[len(testsq)-1][i]:
            maxtmp=delta[len(testsq)-1][i]
            max_i=i
    mytestchoic.append(max_i)
    for i in range(1,len(testsq)):
        mytestchoic.append(fai[i-1][mytestchoic[i-1]])
    for i in range(len(testsq)):
        mytestos.append(label[mytestchoic[i]])
    print(mytestos)

最大熵隐马模型:

最大熵的方法就是将隐马模型中的B这里的矩阵参数进行优化。另外因为这个模型又要考虑相近状态,所以在这里所有的x相当于当前序列+当前序列标记(xi+yi),y为前一个标签状态(yi-1) 最大熵的就是用来优化似然函数的一种方法,想办法保证全局最优,期望一个最佳最合理的P(y|x)来预测。 特征函数f(x,y)(特征函数,说白了就是一个集合,满足这一条件的xy就判为1,否则为0) memm1 注意:这里仅仅考虑标签只有一类的情况,若是多类情况,则需要分别对每一种特征构造特征模板,所以多类情况时w也是一个二维数组。最后的p(y|x)应对应隐马模型中的B 对于似然函数优化: memm2 其中W是可变的,在迭代中会不断变化他的值,Z(x)表示所有特征发生的情况下当前x发生的情况(写程序的时候直接把f()写成只含0,1的数组不就好了……) 代码:

#各种统计初始
def definef():
    for i in range(len(label)):
        M.append(trainos.count(label[i]))
        for j in range(len(trainx)):
            f[i].append(0)
            w[i].append(0)
            proyx[i].append(0)
            provx[i].append(0)
    for i in range(trainlen-1):
        f[label.index(trainos[i])][trainx.index(str(trainsq[i+1]+trainos[i+1]))]=1

def countpos():
    #对于每个特征找各自概率
    for i in range(len(label)):
        countxy=0
        for j in range(trainlen-1):
            if(f[i][trainx.index(trainsq[j+1]+trainos[j+1])]==1 and trainos[j]==label[i]):
                countxy+=1
            provx[i][trainx.index(trainsq[j+1]+trainos[j+1])]+=1
        for j in range(len(trainx)):
            provx[i][j]/=trainlen
        provxy[i]=countxy/trainlen

def countyxpos():
    for i in range(len(label)):
        z=0
        p=[]
        for j in range(len(trainx)):
            p.append(0)
        for j in range(trainlen-1):
            if(trainos[j+1]==label[i]):
                if(f[i][trainx.index(trainsq[j+1]+trainos[j+1])]==1):
                    z+=math.e**(w[i][trainx.index(trainsq[j+1]+trainos[j+1])]*trainx.count(trainsq[j+1]+trainos[j+1]))
            if (f[i][trainx.index(trainsq[j + 1] + trainos[j + 1])] == 1):
                p[trainx.index(trainsq[j+1]+trainos[j+1])]+=w[i][trainx.index(trainsq[j+1]+trainos[j+1])]
        for j in range(len(trainx)):
            if(z!=0):proyx[i][j]=(math.e**p[j])/z
#开始迭代了
def iterate(times):
    for i in range(times):
        for l in range(len(label)):
            for j in range(len(trainx)):
                tmp=0
                if(M[l]!=0 and provx[l][j]*proyx[l][j]*f[l][j]!=0):
                    tmp+=math.log(provxy[l]/provx[l][j]*proyx[l][j]*f[l][j])/M[l]
                global w
                w[l][j]+=tmp
        countyxpos()
        print(i)

注意,尽管一个数据可能序列有多条,输出一条标签,这是需要人为将这些标签合成成一条标签。有点狗血……

© 著作权归作者所有

共有 人打赏支持
Digimon
粉丝 40
博文 17
码字总数 14810
作品 0
成都
程序员
经典概率模型和条件随机场

概率模型概述 由上图中可知,1):贝叶斯模型(NB)和隐马尔科夫模型(HMM)都属于求取联合概率的模型,而最大熵模型(ME)和条件随机场模型(CRF)则是求取条件概率模型。2):贝叶斯模型和...

lirainbow0 ⋅ 2017/09/10 ⋅ 0

条件随机场学习笔记

条件随机场学习笔记 前言 这是在《统计学习方法》中学习到的最后一个方法了,不像其他统计方法,学完精气神超足,都能让我继续振奋好几日。然学完该方法,我陷入了沉思与迷茫。首先,对条件随...

u014688145 ⋅ 2017/02/27 ⋅ 0

NLP学习:隐马尔科夫模型(一)

在大学学习的时候,我们就已经学习过马尔科夫链,这里对于马尔科夫链就不多做赘述,而今天这一篇文章所要概括的是隐马尔科夫模型(HMM). ps:马尔科夫的彼得堡数学学派挺有意思,有兴趣的可以找一些...

云时之间 ⋅ 2017/12/29 ⋅ 0

机器学习 西瓜书 Day18 概率图模型(上)

p319 - p330 今天在寝室宅了一天 或者说玩了一天:) 晚上好运吧 进入第14章 第14章 概率图模型 14.1 隐马尔科夫模型 概率模型提出了一种描述框架,将学习任务归结于计算变量的概率分布。 生...

皇家马德里主教练齐达内 ⋅ 05/26 ⋅ 0

统计学习方法资源汇总

统计学习方法资源汇总 历时近半年《统计学习方法》的学习,今天告一段落。也没什么好说的,在学习过程遇到的一些坑,和搜集到的一些资料都在此汇总下,方便自己复习查阅。 统计学习方法总结 ...

u014688145 ⋅ 2017/03/07 ⋅ 0

【机器学习 基本概念】从朴素贝叶斯到维特比算法:详解隐马尔科夫模型

本文转载自:从朴素贝叶斯到维特比算法:详解马尔科夫模型 本文将从简要介绍朴素贝叶斯开始,再将其扩展到隐马尔科夫模型。我们不仅会讨论隐马尔科夫模型的基本原理,同时还会从朴素贝叶斯的...

gongxifacai_believe ⋅ 2017/11/28 ⋅ 0

人工智障学习笔记——机器学习(5)朴素贝叶斯

一.概念 1.1贝叶斯定理:假设H[1],H[2]…,H[n]互斥且构成一个完全事件,已知它们的概率P(H[i]),i=1,2,…,n,现观察到某事件A与H[1],H[2]…,H[n]相伴随机出现,且已知条件概率P(A/H[i]),求P(H...

sm9sun ⋅ 2017/11/10 ⋅ 0

隐马尔科夫模型 python 实现简单拼音输入法

点击上方“程序员大咖”,选择“置顶公众号” 关键时刻,第一时间送达! 在网上看到一篇关于隐马尔科夫模型的介绍,觉得简直不能再神奇,又在网上找到大神的一篇关于如何用隐马尔可夫模型实现...

px01ih8 ⋅ 2017/12/11 ⋅ 0

传说中的马尔科夫链到底是个什么鬼?

话说自从接触数据分析以来,就不断在各种文献和大牛的文章里看到马尔科夫链这种东西。对于像小编这种经管出身、半路出家的数据爱好者而言,老是让这种一头雾水的名词出现在自己眼前又无可奈何...

R语言中文社区 ⋅ 02/27 ⋅ 0

结合Logistic回归构建最大熵马尔科夫模型

判定模型 vs 生成模型 上一篇博文中,我讨论了朴素贝叶斯模型,以及它与隐马尔可夫模型之间的联系。它们都属于生成模型,但本文要讲的 Logistic 回归模型是一个判定模型,全文以讨论这种差异...

小数点 ⋅ 2017/11/27 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

使用 vue-cli 搭建项目

vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目,GitHub地址是:https://github.com/vuejs/vue-cli 一、 安装 node.js 首先需要安装node环境,可以直接到中...

初学者的优化 ⋅ 20分钟前 ⋅ 0

设计模式 之 享元模式

设计模式 之 享元模式 定义 使用共享技术来有效地支持大量细粒度对象的复用 关键点:防止类多次创建,造成内存溢出; 使用享元模式来将内部状态与外部状态进行分离,在循环创建对象的环境下,...

GMarshal ⋅ 36分钟前 ⋅ 0

SpringBoot集成Druid的最简单的小示例

参考网页 https://blog.csdn.net/king_is_everyone/article/details/53098350 建立maven工程 Pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM......

karma123 ⋅ 今天 ⋅ 0

Java虚拟机基本结构的简单记忆

Java堆:一般是放置实例化的对象的地方,堆分新生代和老年代空间,不断未被回收的对象越老,被放入老年代空间。分配最大堆空间:-Xmx 分配初始堆空间:-Xms,分配新生代空间:-Xmn,新生代的大小一...

算法之名 ⋅ 今天 ⋅ 0

OSChina 周日乱弹 —— 这么好的姑娘都不要了啊

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @TigaPile :分享曾惜的单曲《讲真的》 《讲真的》- 曾惜 手机党少年们想听歌,请使劲儿戳(这里) @首席搬砖工程师 :怎样约女孩子出来吃饭,...

小小编辑 ⋅ 今天 ⋅ 8

Jenkins实践3 之脚本

#!/bin/sh# export PROJ_PATH=项目路径# export TOMCAT_PATH=tomcat路径killTomcat(){pid=`ps -ef | grep tomcat | grep java|awk '{print $2}'`echo "tom...

晨猫 ⋅ 今天 ⋅ 0

Spring Bean的生命周期

前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 首先看下生命周期图: 再谈生命周期之前有一点需要先明确: Spring 只帮我们管理单例模...

素雷 ⋅ 今天 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部