维特比算法

动态规划求最短路径算法,与穷举法相比优点在于大大降低了时间复杂度;

  1. 假如从起点A到终点S的最短路径Road经过点B1,那么从起点A到B1的最短路径的终点就是B1,否则如果存在一个B2使得A到B2的距离小于B1,那么起点A到终点S的最短路径Road就不应该经过B1,而应该经过B2,这显示是矛盾的,证明了满足最优性原理;
  2. 假设从A到S需要经过N个时刻,每个时刻有M个状态(B1,B2...BM),那么我们只需要记录对应每个状态的最短路径即可,这样在任意时刻,只需要考虑非常有限的几种最短路径即可(取决于该时刻对应的状态个数),且不需要向上考虑之前的时刻,也就是不存在多维条件问题;
  3. 结合以上两点,假设当前我们需要从时刻i到i+1时,从起始点S到时刻i的所有最短路径已经找出并记录到时刻i的所有状态上了,那么我们只需要考虑没时刻i的所有状态的最短路径连接到时刻i+1的所有状态上后得到的对应每个状态的最短路径并记录到状态中即可(后续计算与时刻i已无关);
  4. 循环3,知道终点时刻为止,此时终点的所有状态中都保存了一个最短路径,取其中最短即可(或者说最大概率);

Python Code:

import sys

states = ('Rainy', 'Sunny', 'Snowy', 'Thunder')
 
observations = ('walk', 'playSnow', 'clean', 'clean', 'shop', 'clean', 'walk', 'shop', 'clean', 'playSnow', 'scare', 'walk')
 
start_probability = {'Rainy': 0.4, 'Sunny': 0.3, 'Snowy': 0.2, 'Thunder': 0.1}
 
transition_probability = {
    'Rainy' : {'Rainy': 0.5, 'Sunny': 0.2, 'Snowy': 0.15, 'Thunder': 0.15},
    'Sunny' : {'Rainy': 0.1, 'Sunny': 0.5, 'Snowy': 0.3, 'Thunder': 0.1},
    'Snowy' : {'Rainy': 0.4, 'Sunny': 0.2, 'Snowy': 0.3, 'Thunder': 0.1},
    'Thunder' : {'Rainy': 0.4, 'Sunny': 0.2, 'Snowy': 0.1, 'Thunder': 0.3},
    }
 
emission_probability = {
    'Rainy' : {'walk': 0.1, 'shop': 0.3, 'clean': 0.4, 'playSnow':0.1, 'scare':0.1},
    'Sunny' : {'walk': 0.4, 'shop': 0.2, 'clean': 0.1, 'playSnow':0.1, 'scare':0.1},
    'Snowy' : {'walk': 0.2, 'shop': 0.1, 'clean': 0.2, 'playSnow':0.4, 'scare':0.1},
    'Thunder' : {'walk': 0.1, 'shop': 0.1, 'clean': 0.4, 'playSnow':0.1, 'scare':0.3},
}

def viterbi_output(states,observations,start_probability,transition_probability,emission_probability):
    """
    states:隐状态
    observations:观察状态
    start_probability:初始概率
    transition_probability:转换概率(某个隐状态转换到某个隐状态)
    emission_probability:发射概率(某个隐状态转换到某个观察状态)
    算法思路:
        目的:根据三天的观察状态,计算最有可能的三天天气隐状态
        根据:得到最后一天的概率后,其中概率最大的即表示该条状态链是最有可能的隐状态链
        方法:
            第一天概率:隐状态的初始概率*该状态到第一天的观察状态的发射概率
            其他天概率:前一天隐状态的概率*前一天隐状态到当天隐状态的转换概率*当天隐状态到当天观察状态的发射概率
        关键:
            1.并不需要保存每一天的状态,实际上每天的循环计算中只会用到前一天的数据即可(因此V这个变量实际上长度为2即可)
            2.路径的保存
    """
    V = [{}]#V[时间][天气]=概率
    path = {}#保存路径
    #第一天
    for state in states:
        V[0][state]=start_probability[state]*emission_probability[state][observations[0]]
        path[state]=[state]
        print "第一天概率估计:(天气:%s,概率:%f)" % (state,V[0][state])
    #其他时间
    for day in range(1,len(observations)):
        print "第%d天概率估计:" % (day+1)
        V.append({})
        newPath = {}
        for day_s in states:
            (prop,state) = max([V[day-1][s]*transition_probability[s][day_s]*emission_probability[day_s][observations[day]],s]for s in states)
            V[day][day_s]=prop
            newPath[day_s] = path[state]+[day_s]
            print "\t假设当前隐状态为:%s,得到最大概率:%f,对应前一天隐状态:%s" % (day_s,prop,state)
        path = newPath
    return max([(V[len(observations)-1][prop],path[prop])for prop in V[len(observations)-1]])

if __name__ == '__main__':
#argv[1]表示计算观察的天数
    print viterbi_output(states,observations[:int(sys.argv[1])],start_probability,transition_probability,emission_probability)

时间长度为5天时的运行结果图

运行结果图
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容

  • 前言:作为堂堂数学系的学生,竟然很多算法都不会。表示对自己很失望,今天学习了一下维特比算法,发现很简单,而且隐约中...
    风之子doudou阅读 439评论 0 0
  • 不知从什么时候开始,整句识别成为了拼音输入法的标配,几乎每一款输入法都有整句输入功能。重码量巨大的拼音输入也因此逐...
    罗立青阅读 2,463评论 0 7
  • 前天去了趟南京,昨天匆匆忙忙的赶回来,来回将近六个小时的车程,我已精疲力竭。 关节炎也复发了,走着路仿佛又回到了高...
    爱喝酸奶的猫阅读 376评论 0 0
  • 长安街头,细雨绵绵 你一袭白衣 持伞而立 驻足凝望 或明媚,或忧伤 忽觉你就是那个少年 在梦里,在时光里 我愿将此...
    哈哈嘿Y阅读 192评论 2 2
  • 让我掉下眼泪的,不止杯中的酒,让我依依不舍的,不止你的温柔…… 第一次听这首歌还是湖南台的《歌手》,听着赵雷唱着,...
    浅唱幸福yiyi阅读 380评论 0 1