日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

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

發布時間:2023/12/20 python 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 维特比算法 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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。