維特比算法(Viterbi)
維特比算法
編輯html
維特比算法是一種
動態規劃算法用於尋找最有可能產生觀測事件序列的-維特比路徑-隱含狀態序列,特別是在馬爾可夫信息源上下文和隱馬爾可夫模型中。術語「維特比路徑」和「維特比算法」也被用於尋找觀察結果最有可能解釋相關的動態規劃算法。例如在統計句法分析中動態規劃算法能夠被用於發現最可能的上下文無關的派生(解析)的字符串,有時被稱爲「維特比分析」。
維特比算法由安德魯·維特比(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.已知狀況:google
隱含的身體狀態 = { 健康 , 發燒 }
可觀察的感受狀態 = { 正常 , 冷 , 頭暈 }
月兒預判的阿驢身體狀態的機率分佈 = { 健康: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.題目:spa
已知如上,求:阿驢這三天的身體健康狀態變化的過程是怎麼樣的?
4.過程:3d
根據 Viterbi 理論,後一天的狀態會依賴前一天的狀態和當前的可觀察的狀態。那麼只要根據第一天的正常狀態依次推算找出到達第三天頭暈狀態的最大的機率,就能夠知道這三天的身體變化狀況。
傳不了圖片,悲劇了。。。
1.初始狀況:
- P(健康) = 0.6,P(發燒)=0.4。
2.求第一天的身體狀況:
計算在阿驢感受正常的狀況下最可能的身體狀態。htm
- P(今天健康) = P(正常|健康)*P(健康|初始狀況) = 0.5 * 0.6 = 0.3
- P(今天發燒) = P(正常|發燒)*P(發燒|初始狀況) = 0.1 * 0.4 = 0.04
那麼就能夠認爲第一天最可能的身體狀態是:健康。
3.求次日的身體情況:
計算在阿驢感受冷的狀況下最可能的身體狀態。
那麼次日有四種狀況,因爲第一天的發燒或者健康轉換到次日的發燒或者健康。blog
- 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.結論
根據如上計算。這樣月兒判定,阿驢這三天身體變化的序列是:健康->健康->發燒。
這個算法大概就是經過已知的能夠觀察到的序列,和一些已知的狀態轉換之間的機率狀況,經過綜合狀態之間的轉移機率和前一個狀態的狀況計算出機率最大的狀態轉換路徑,從而推斷出隱含狀態的序列的狀況。
轉載自:https://www.cnblogs.com/Renyi-Fan/p/7865985.html
參考:https://zh.wikipedia.org/wiki/%E7%BB%B4%E7%89%B9%E6%AF%94%E7%AE%97%E6%B3%95