維特比算法(Viterbi)
維特比算法是一種
動態規划算法用於尋找最有可能產生觀測事件序列的-維特比路徑-隱含狀態序列,特別是在馬爾可夫信息源上下文和隱馬爾可夫模型中。術語“維特比路徑”和“維特比算法”也被用於尋找觀察結果最有可能解釋相關的動態規划算法。例如在統計句法分析中動態規划算法可以被用於發現最可能的上下文無關的派生(解析)的字符串,有時被稱為“維特比分析”。
維特比算法由安德魯·維特比(Andrew Viterbi)於1967年提出,用於在數字通信鏈路中解卷積以消除噪音。 此算法被廣泛應用於
CDMA和GSM數字蜂窩網絡、撥號調制解調器、衛星、深空通信和
802.11無線網絡中解卷積碼。現今也被常常用於
語音識別、關鍵字識別、
計算語言學和
生物信息學中。例如在語音(語音識別)中,聲音信號作為觀察到的事件序列,而文本字符串,被看作是隱含的產生聲音信號的原因,因此可對聲音信號應用維特比算法尋找最有可能的文本字符串。[1]
維特比算法的基礎可以概括成下面三點:
-
如果概率最大的路徑p(或者說最短路徑)經過某個點,比如途中的X22,那么這條路徑上的起始點S到X22的這段子路徑Q,一定是S到X22之間的最短路徑。否則,用S到X22的最短路徑R替代Q,便構成一條比P更短的路徑,這顯然是矛盾的。證明了滿足最優性原理。
-
從S到E的路徑必定經過第i個時刻的某個狀態,假定第i個時刻有k個狀態,那么如果記錄了從S到第i個狀態的所有k個節點的最短路徑,最終的最短路徑必經過其中一條,這樣,在任意時刻,只要考慮非常有限的最短路即可。
3. 結合以上兩點,假定當我們從狀態i進入狀態i+1時,從S到狀態i上各個節的最短路徑已經找到,並且記錄在這些節點上,那么在計算從起點S到第i+1狀態的某個節點Xi+1的最短路徑時,只要考慮從S到前一個狀態i所有的k個節點的最短路徑,以及從這個節點到Xi+1,j的距離即可。
應用:
推斷天氣等

嘗試用高中概率知識去理解一下 Veterbi 算法。內容絕對粗淺,100% 抄襲,歡迎指正。用一個別人家的栗子來說一下。
1.題目背景:
從前有個村兒,村里的人的身體情況只有兩種可能:健康或者發燒。
假設這個村兒的人沒有體溫計或者百度這種神奇東西,他唯一判斷他身體情況的途徑就是到村頭我的偶像金正月的小診所詢問。
月兒通過詢問村民的感覺,判斷她的病情,再假設村民只會回答正常、頭暈或冷。
有一天村里奧巴驢就去月兒那去詢問了。
第一天她告訴月兒她感覺正常。
第二天她告訴月兒感覺有點冷。
第三天她告訴月兒感覺有點頭暈。
那么問題來了,月兒如何根據阿驢的描述的情況,推斷出這三天中阿驢的一個身體狀態呢?
為此月兒上百度搜 google ,一番狂搜,發現維特比算法正好能解決這個問題。月兒樂了。
2.已知情況:
隱含的身體狀態 = { 健康 , 發燒 }
可觀察的感覺狀態 = { 正常 , 冷 , 頭暈 }
月兒預判的阿驢身體狀態的概率分布 = { 健康:0.6 , 發燒: 0.4 }
月兒認為的阿驢身體健康狀態的轉換概率分布 = {
健康->健康: 0.7 ,
健康->發燒: 0.3 ,
發燒->健康:0.4 ,
發燒->發燒: 0.6
}
月兒認為的在相應健康狀況條件下,阿驢的感覺的概率分布 = {
健康,正常:0.5 ,冷 :0.4 ,頭暈: 0.1 ;
發燒,正常:0.1 ,冷 :0.3 ,頭暈: 0.6
}
阿驢連續三天的身體感覺依次是: 正常、冷、頭暈 。
3.題目:
已知如上,求:阿驢這三天的身體健康狀態變化的過程是怎么樣的?
4.過程:
根據 Viterbi 理論,后一天的狀態會依賴前一天的狀態和當前的可觀察的狀態。那么只要根據第一天的正常狀態依次推算找出到達第三天頭暈狀態的最大的概率,就可以知道這三天的身體變化情況。
傳不了圖片,悲劇了。。。
1.初始情況:
- P(健康) = 0.6,P(發燒)=0.4。
2.求第一天的身體情況:
計算在阿驢感覺正常的情況下最可能的身體狀態。
- P(今天健康) = P(正常|健康)*P(健康|初始情況) = 0.5 * 0.6 = 0.3
- P(今天發燒) = P(正常|發燒)*P(發燒|初始情況) = 0.1 * 0.4 = 0.04
那么就可以認為第一天最可能的身體狀態是:健康。
3.求第二天的身體狀況:
計算在阿驢感覺冷的情況下最可能的身體狀態。
那么第二天有四種情況,由於第一天的發燒或者健康轉換到第二天的發燒或者健康。
- P(前一天發燒,今天發燒) = P(前一天發燒)*P(發燒->發燒)*P(冷|發燒) = 0.04 * 0.6 * 0.3 = 0.0072
- P(前一天發燒,今天健康) = P(前一天發燒)*P(發燒->健康)*P(冷|健康) = 0.04 * 0.4 * 0.4 = 0.0064
- P(前一天健康,今天健康) = P(前一天健康)*P(健康->健康)*P(冷|健康) = 0.3 * 0.7 * 0.4 = 0.084
- P(前一天健康,今天發燒) = P(前一天健康)*P(健康->發燒)*P(冷|發燒) = 0.3 * 0.3 *.03 = 0.027
那么可以認為,第二天最可能的狀態是:健康。
4.求第三天的身體狀態:
計算在阿驢感覺頭暈的情況下最可能的身體狀態。
- P(前一天發燒,今天發燒) = P(前一天發燒)*P(發燒->發燒)*P(頭暈|發燒) = 0.027 * 0.6 * 0.6 = 0.00972
- P(前一天發燒,今天健康) = P(前一天發燒)*P(發燒->健康)*P(頭暈|健康) = 0.027 * 0.4 * 0.1 = 0.00108
- P(前一天健康,今天健康) = P(前一天健康)*P(健康->健康)*P(頭暈|健康) = 0.084 * 0.7 * 0.1 = 0.00588
- P(前一天健康,今天發燒) = P(前一天健康)*P(健康->發燒)*P(頭暈|發燒) = 0.084 * 0.3 *0.6 = 0.01512
那么可以認為:第三天最可能的狀態是發燒。
5.結論
根據如上計算。這樣月兒斷定,阿驢這三天身體變化的序列是:健康->健康->發燒。
這個算法大概就是通過已知的可以觀察到的序列,和一些已知的狀態轉換之間的概率情況,通過綜合狀態之間的轉移概率和前一個狀態的情況計算出概率最大的狀態轉換路徑,從而推斷出隱含狀態的序列的情況。
參考:
誰能通俗的講解下viterbi算法? - 知乎
https://www.zhihu.com/question/20136144