日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

维特比算法 python_维特比算法理解与实现(Python)

發(fā)布時(shí)間:2023/12/20 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 维特比算法 python_维特比算法理解与实现(Python) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

寫(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。