维特比算法 python_维特比算法理解与实现(Python)
前言
寫這篇文章就是想以通俗易懂的方式解析維特比算法,最后給出Python代碼的實現。下面的公式和原理均出自《統計學習方法》。
算法的原理
算法的原理1.PNG
算法的原理2.PNG
上面寫了一大堆,意思就是:每個時刻選擇出概率最大的路徑,將路徑上的每個結點連接起來就得到了最優路徑。那么可以根據這個原理,很容易就可以根據觀測求出每個時刻最有可能的狀態。
算法的思路
算法思路1.PNG
算法思路2.PNG
下面我們可以根據算法的原理,分析書上算法的思路。
步驟(1)初始化:
t = 1時刻分別求出N個狀態下產生觀測變量1的概率。
步驟(2)遞推:
當t和i不變時j = 1,2,3,...,N是分別求出t - 1時刻所有可能的狀態,轉移到t時刻狀態i的概率。max是求最大值,就是在t-1時刻各個狀態轉移到t時刻狀態 i 的最大概率,最后乘以觀測概率就是t狀態 i 最有可能產生觀測變量 t 的概率。argmax是求在t-1時刻的狀態最有可能轉移到 t 時刻的狀態 i 。
如果想求出t - 1時刻的所有可能狀態轉移到 t 時刻所有可能狀態的最大概率,則在步驟(2)的式子最外層再增加一個循環i = 1,2,3,...,N。
如果想求出各個時刻最有可能的狀態,則在步驟(2)的式子最外層增加一個循環t = 2,3,4,...,T。
步驟(3)終止:
這個很簡單沒什么好說的了。
步驟(4)最優路徑回溯:
根據t = T時刻最有可能的狀態反向推出t = T - 1, t = T - 1,...,2,1時刻最有可能的狀態。
完整實現代碼
import numpy as np
from numpy import *
import math
def viterbi(A, B, PI, O):
N = shape(A)[0]
I = mat(zeros((N, 1)))
T = N
sigma = mat(zeros((N, N)))
omiga = mat(ones((N, N)))
index = 0
for i in range(N):
if(O[0, 0] == 0):
index = 0
else:
index = 1
sigma[0, i] = PI[i, 0] * B[i, index]
t = 1
while(t < T):
for i in range(N):
sigma_temp = mat(zeros((N, 1)))
for j in range(N):
sigma_temp[j, 0] = sigma[t - 1, j] * A[j, i]
max_value = sigma_temp.max(axis = 0)
if(O[t, 0] == 0):
index = 0
else:
index = 1
sigma[t, i] = max_value[0, 0] * B[i, index]
omiga[t, i] = sigma_temp.argmax() + 1
t += 1
P = sigma[N - 1, :].max()
I[T -1, 0] = sigma[N - 1, :].argmax() + 1
t = T - 2
print(omiga)
while(t >= 0):
index = int(I[t + 1, 0] - 1)
I[t, 0] = omiga[t + 1, index]
t -= 1
return I
if __name__ == "__main__":
A = mat([[0.5, 0.2, 0.3],
[0.3, 0.5, 0.2],
[0.2, 0.3, 0.5]])
B = mat([[0.5, 0.5],
[0.4, 0.6],
[0.7, 0.3]])
PI = mat([[0.2],
[0.4],
[0.4]])
O = mat([[0],
[1],
[0]])
I = viterbi(A, B, PI, O)
print(I)
輸入數據
輸入數據和《統計學習方法》這本書上的例子一樣
A = mat([[0.5, 0.2, 0.3],
[0.3, 0.5, 0.2],
[0.2, 0.3, 0.5]])
B = mat([[0.5, 0.5],
[0.4, 0.6],
[0.7, 0.3]])
PI = mat([[0.2],
[0.4],
[0.4]])
O = mat([[0],
[1],
[0]])
輸入數據.PNG
本文的輸出結果
輸出結果.PNG
書上的輸出結果
書上的輸出結果.PNG
兩者結果對比是一樣的,有興趣的可以運行一下我的代碼,打印出w這個參數的值,也是和書上的例子是一樣的。
總結
以上是生活随笔為你收集整理的维特比算法 python_维特比算法理解与实现(Python)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 批量创建文件夹并命名
- 下一篇: python通过scapy模块进行arp