维特比算法 python_维特比算法理解与实现(Python)
前言
寫(xiě)這篇文章就是想以通俗易懂的方式解析維特比算法,最后給出Python代碼的實(shí)現(xiàn)。下面的公式和原理均出自《統(tǒng)計(jì)學(xué)習(xí)方法》。
算法的原理
算法的原理1.PNG
算法的原理2.PNG
上面寫(xiě)了一大堆,意思就是:每個(gè)時(shí)刻選擇出概率最大的路徑,將路徑上的每個(gè)結(jié)點(diǎn)連接起來(lái)就得到了最優(yōu)路徑。那么可以根據(jù)這個(gè)原理,很容易就可以根據(jù)觀測(cè)求出每個(gè)時(shí)刻最有可能的狀態(tài)。
算法的思路
算法思路1.PNG
算法思路2.PNG
下面我們可以根據(jù)算法的原理,分析書(shū)上算法的思路。
步驟(1)初始化:
t = 1時(shí)刻分別求出N個(gè)狀態(tài)下產(chǎn)生觀測(cè)變量1的概率。
步驟(2)遞推:
當(dāng)t和i不變時(shí)j = 1,2,3,...,N是分別求出t - 1時(shí)刻所有可能的狀態(tài),轉(zhuǎn)移到t時(shí)刻狀態(tài)i的概率。max是求最大值,就是在t-1時(shí)刻各個(gè)狀態(tài)轉(zhuǎn)移到t時(shí)刻狀態(tài) i 的最大概率,最后乘以觀測(cè)概率就是t狀態(tài) i 最有可能產(chǎn)生觀測(cè)變量 t 的概率。argmax是求在t-1時(shí)刻的狀態(tài)最有可能轉(zhuǎn)移到 t 時(shí)刻的狀態(tài) i 。
如果想求出t - 1時(shí)刻的所有可能狀態(tài)轉(zhuǎn)移到 t 時(shí)刻所有可能狀態(tài)的最大概率,則在步驟(2)的式子最外層再增加一個(gè)循環(huán)i = 1,2,3,...,N。
如果想求出各個(gè)時(shí)刻最有可能的狀態(tài),則在步驟(2)的式子最外層增加一個(gè)循環(huán)t = 2,3,4,...,T。
步驟(3)終止:
這個(gè)很簡(jiǎn)單沒(méi)什么好說(shuō)的了。
步驟(4)最優(yōu)路徑回溯:
根據(jù)t = T時(shí)刻最有可能的狀態(tài)反向推出t = T - 1, t = T - 1,...,2,1時(shí)刻最有可能的狀態(tài)。
完整實(shí)現(xiàn)代碼
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)
輸入數(shù)據(jù)
輸入數(shù)據(jù)和《統(tǒng)計(jì)學(xué)習(xí)方法》這本書(shū)上的例子一樣
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]])
輸入數(shù)據(jù).PNG
本文的輸出結(jié)果
輸出結(jié)果.PNG
書(shū)上的輸出結(jié)果
書(shū)上的輸出結(jié)果.PNG
兩者結(jié)果對(duì)比是一樣的,有興趣的可以運(yùn)行一下我的代碼,打印出w這個(gè)參數(shù)的值,也是和書(shū)上的例子是一樣的。
總結(jié)
以上是生活随笔為你收集整理的维特比算法 python_维特比算法理解与实现(Python)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 批量创建文件夹并命名
- 下一篇: python通过scapy模块进行arp