资讯专栏INFORMATION COLUMN

vertibi python 实现

zhangyucha0 / 2469人阅读

摘要:题目阐释算法实现。用实现的和表现层的转移动态规划问题,归结到相邻两个之间存在转移概率,转移概率。难点三层循环,为了保留,计算每个的的概率,所以要嵌套在之外。

题目阐释:

viterbi算法实现。 用python实现viterbi的hidden state 和 表现层的转移
动态规划问题,归结到
    相邻两个step之间存在 state转移概率,state2emibission转移概率。
    计算后可以得到每个step的每个state max_probablity
    由于step_n依赖于 step_n-1,跟 step_n-2无关,所以可以一直如此往复,得到最后的max_prob
整个问题抽象为,下一个step依赖于上一个step的所有state,所以只需要计算每一层step的所有state的prbo即可。

难点:

三层for循环,为了保留,计算每个step的state的概率,所以要 next_state 嵌套在 source_state之外。

states=["Rainy","Sunny"]
observations=["walk","shop","clean"]
observations=("walk","clean","walk")

emission_probability={"Rainy":{"walk":0.1,"shop":0.4,"clean":0.5},
                   "Sunny": {"walk": 0.6, "shop": 0.3, "clean": 0.1}
                    }
trans_probability={"Rainy":{"Rainy":0.7,"Sunny":0.3},
                     "Sunny":{"Rainy":0.4,"Sunny":0.6}
                     }
start_probability={"Rainy":0.6,"Sunny":0.4}

def vertibi(states,objservations,start_prob,trans_prob,emi_prob):
    T={state:[start_prob[state],[state],start_prob[state]] for state in states}
    for objservation in objservations:
        U={}
        for next_state in states:
            total=0
            argmax=None
            valmax=0
            for source_state in states:
                prob,v_path,v_prob=T[source_state]
                p=emi_prob[source_state][objservation]*trans_prob[source_state][next_state]
                prob*=p
                v_prob*=p

                if v_prob>valmax:
                    valmax=v_prob
                    argmax=v_path+[next_state]
                    total+=prob
            U[next_state]=[total,argmax,valmax]
        T=U

    total = 0
    argmax = None
    valmax = 0
    for state in states:
        prob, v_path, v_prob=T[state]
        if v_prob>valmax:
            argmax=v_path
            total=prob
            valmax=v_prob
    return total,argmax,valmax

total,argmax,valmax=vertibi(states,observations,start_probability,trans_probability,emission_probability)
print(total)
print(argmax)
print(valmax)


文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42110.html

相关文章

  • 结巴分词原理

    摘要:我来到北京清华大学对应的状态应该为其实和的区别就是对未成功切分的部分,没有使用进行分词。 介绍 结巴分词是一个受大家喜爱的分词库,源码地址为github,今天我们就跟进源码,看一下结巴分词的原理 原理 def cut(self, sentence, cut_all=False, HMM=True): The main function that...

    zzbo 评论0 收藏0
  • 结巴分词原理

    摘要:我来到北京清华大学对应的状态应该为其实和的区别就是对未成功切分的部分,没有使用进行分词。 介绍 结巴分词是一个受大家喜爱的分词库,源码地址为github,今天我们就跟进源码,看一下结巴分词的原理 原理 def cut(self, sentence, cut_all=False, HMM=True): The main function that...

    Miracle 评论0 收藏0
  • 首次公开,整理12年积累的博客收藏夹,零距离展示《收藏夹吃灰》系列博客

    摘要:时间永远都过得那么快,一晃从年注册,到现在已经过去了年那些被我藏在收藏夹吃灰的文章,已经太多了,是时候把他们整理一下了。那是因为收藏夹太乱,橡皮擦给设置私密了,不收拾不好看呀。 ...

    Harriet666 评论0 收藏0
  • Python源码漫游指南(一)

    摘要:源码漫游指南一作者秘塔科技算法研究员前几天发布了第五届顶级语言交互排行榜,语言继续稳坐第一把交椅,并且相比去年的排行情况,拉开了与第二名的距离去年第二名的排名得分为。包含字节码相关的底层抽象。字节码对象的实现。源文件执行结束后的清理工作。 Python源码漫游指南(一) 作者:秘塔科技算法研究员 Qian Wan 前几天IEEE Spectrum发布了第五届顶级语言交互排行榜,Pyth...

    dackel 评论0 收藏0
  • python 和 ruby的对比

    摘要:的解析器实现更成熟,第三方库质量高解析器尽管已经有了很大的性能提升和很多新的功能,但是从源代码实现的角度来说,基本上是通过在源代码上打来增加功能的。相对而言,解析器更成熟,也比较稳定。 最近在考虑学习一门后端语言,在ruby和python直接犹豫,然后自己做了一些对比,希望能帮到有同样问题的你。 一、异同对比选择1、Python和ruby的相同点: 都强调语法简单,都具有更一般的表达...

    ghnor 评论0 收藏0

发表评论

0条评论

zhangyucha0

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<