最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實現(xiàn)隱馬爾可夫模型的前向后向算法的示例代碼

 更新時間:2019年12月31日 11:56:52   作者:潤°  
這篇文章主要介紹了Python實現(xiàn)隱馬爾可夫模型的前向后向算法,本文通過實例代碼給大家講解的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下

本篇文章對隱馬爾可夫模型的前向和后向算法進行了Python實現(xiàn),并且每種算法都給出了循環(huán)和遞歸兩種方式的實現(xiàn)。

前向算法Python實現(xiàn)

循環(huán)方式

import numpy as np
def hmm_forward(Q, V, A, B, pi, T, O, p):
  """
  :param Q: 狀態(tài)集合
  :param V: 觀測集合
  :param A: 狀態(tài)轉(zhuǎn)移概率矩陣
  :param B: 觀測概率矩陣
  :param pi: 初始概率分布
  :param T: 觀測序列和狀態(tài)序列的長度
  :param O: 觀測序列
  :param p: 存儲各個狀態(tài)的前向概率的列表,初始為空
  """
  for t in range(T):
    # 計算初值
    if t == 0:
      for i in range(len(Q)):
        p.append(pi[i] * B[i, V[O[0]]])
    # 初值計算完畢后,進行下一時刻的遞推運算
    else:
      alpha_t_ = 0
      alpha_t_t = []
      for i in range(len(Q)):
        for j in range(len(Q)):
          alpha_t_ += p[j] * A[j, i]
        alpha_t_t.append(alpha_t_ * B[i, V[O[t]]])
        alpha_t_ = 0
      p = alpha_t_t
  return sum(p)
# 《統(tǒng)計學習方法》書上例10.2
Q = [1, 2, 3]
V = {'紅':0, '白':1}
A = np.array([[0.5, 0.2, 0.3], [0.3, 0.5, 0.2], [0.2, 0.3, 0.5]])
B = np.array([[0.5, 0.5], [0.4, 0.6], [0.7, 0.3]])
pi = [0.2, 0.4, 0.4]
T = 3
O = ['紅', '白', '紅']
p = []
print(hmm_forward(Q, V, A, B, pi, T, O, p)) # 0.130218

遞歸方式

import numpy as np
def hmm_forward_(Q, V, A, B, pi, T, O, p, T_final):
  """
  :param T_final:遞歸的終止條件
  """
  if T == 0:
    for i in range(len(Q)):
      p.append(pi[i] * B[i, V[O[0]]])
  else:
    alpha_t_ = 0
    alpha_t_t = []
    for i in range(len(Q)):
      for j in range(len(Q)):
        alpha_t_ += p[j] * A[j, i]
      alpha_t_t.append(alpha_t_ * B[i, V[O[T]]])
      alpha_t_ = 0
    p = alpha_t_t
  if T >= T_final:
    return sum(p)
  return hmm_forward_(Q, V, A, B, pi, T+1, O, p, T_final)

Q = [1, 2, 3]
V = {'紅':0, '白':1}
A = np.array([[0.5, 0.2, 0.3], [0.3, 0.5, 0.2], [0.2, 0.3, 0.5]])
B = np.array([[0.5, 0.5], [0.4, 0.6], [0.7, 0.3]])
pi = [0.2, 0.4, 0.4]
T = 0
O = ['紅', '白', '紅']
p = []
T_final = 2 # T的長度是3,T的取值是(0時刻, 1時刻, 2時刻)
print(hmm_forward_(Q, V, A, B, pi, T, O, p, T_final))

后向算法Python實現(xiàn)

循環(huán)方式

import numpy as np
def hmm_backward(Q, V, A, B, pi, T, O, beta_t, T_final):
  for t in range(T, -1, -1):
    if t == T_final:
      beta_t = beta_t
    else:
      beta_t_ = 0
      beta_t_t = []
      for i in range(len(Q)):
        for j in range(len(Q)):
          beta_t_ += A[i, j] * B[j, V[O[t + 1]]] * beta_t[j]
        beta_t_t.append(beta_t_)
        beta_t_ = 0
      beta_t = beta_t_t
    if t == 0:
      p=[]
      for i in range(len(Q)):
        p.append(pi[i] * B[i, V[O[0]]] * beta_t[i])
      beta_t = p
  return sum(beta_t)
# 《統(tǒng)計學習方法》課后題10.1
Q = [1, 2, 3]
V = {'紅':0, '白':1}
A = np.array([[0.5, 0.2, 0.3], [0.3, 0.5, 0.2], [0.2, 0.3, 0.5]])
B = np.array([[0.5, 0.5], [0.4, 0.6], [0.7, 0.3]])
pi = [0.2, 0.4, 0.4]
T = 3
O = ['紅', '白', '紅', '白']
beta_t = [1, 1, 1]
T_final = 3
print(hmm_backward_(Q, V, A, B, pi, T, O, beta_t, T_final)) # 0.06009

遞歸方式

import numpy as np
def hmm_backward(Q, V, A, B, pi, T, O, beta_t, T_final):
  if T == T_final:
    beta_t = beta_t
  else:
    beta_t_ = 0
    beta_t_t = []
    for i in range(len(Q)):
      for j in range(len(Q)):
        beta_t_ += A[i, j] * B[j, V[O[T+1]]] * beta_t[j]
      beta_t_t.append(beta_t_)
      beta_t_ = 0
    beta_t = beta_t_t
  if T == 0:
    p=[]
    for i in range(len(Q)):
      p.append(pi[i] * B[i, V[O[0]]] * beta_t[i])
    beta_t = p
    return sum(beta_t)
  return hmm_backward(Q, V, A, B, pi, T-1, O, beta_t, T_final)
jpgQ = [1, 2, 3]
V = {'紅':0, '白':1}
A = np.array([[0.5, 0.2, 0.3], [0.3, 0.5, 0.2], [0.2, 0.3, 0.5]])
B = np.array([[0.5, 0.5], [0.4, 0.6], [0.7, 0.3]])
pi = [0.2, 0.4, 0.4]
T = 3
O = ['紅', '白', '紅', '白']
beta_t = [1, 1, 1]
T_final = 3
print(hmm_backward_(Q, V, A, B, pi, T, O, beta_t, T_final)) # 0.06009

這里我有個問題不理解,這道題的正確答案應該是0.061328,我計算出的答案和實際有一點偏差,我跟蹤了代碼的計算過程,發(fā)現(xiàn)在第一次循環(huán)完成后,計算結(jié)果是正確的,第二次循環(huán)后的結(jié)果就出現(xiàn)了偏差,我懷疑是小數(shù)部分的精度造成,希望有人能給出一個更好的解答,如果是代碼的問題也歡迎指正。

以上所述是小編給大家介紹的Python實現(xiàn)隱馬爾可夫模型的前向后向算法,希望對大家有所幫助!

相關文章

  • python 文件操作api(文件操作函數(shù))

    python 文件操作api(文件操作函數(shù))

    總是記不住API。昨晚寫的時候用到了這些,但是沒記住,于是就索性整理一下吧,方便需要的朋友
    2016-08-08
  • Python+AutoIt實現(xiàn)界面工具開發(fā)過程詳解

    Python+AutoIt實現(xiàn)界面工具開發(fā)過程詳解

    這篇文章主要介紹了Python+AutoIt實現(xiàn)界面工具開發(fā)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • Python內(nèi)置模塊hashlib、hmac與uuid用法分析

    Python內(nèi)置模塊hashlib、hmac與uuid用法分析

    這篇文章主要介紹了Python內(nèi)置模塊hashlib、hmac與uuid用法,結(jié)合實例形式較為詳細的分析了hashlib、hmac與uuid模塊的概念、功能及簡單使用方法,需要的朋友可以參考下
    2018-02-02
  • Python之re模塊案例詳解

    Python之re模塊案例詳解

    這篇文章主要介紹了Python之re模塊案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • 基于Python編寫一個單詞自測程序

    基于Python編寫一個單詞自測程序

    這篇文章主要為大家詳細介紹了如何基于Python編寫一個單詞自測程序,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-12-12
  • Python類的繼承用法示例

    Python類的繼承用法示例

    這篇文章主要介紹了Python類的繼承用法,結(jié)合實例形式分析了Python類的定義、繼承等相關操作技巧,需要的朋友可以參考下
    2019-01-01
  • 如何給pip更換國內(nèi)源并配置Python的國內(nèi)鏡像詳解

    如何給pip更換國內(nèi)源并配置Python的國內(nèi)鏡像詳解

    pip安裝的包都存在于外國的服務器上,速度會非常慢,可以給pip配置國內(nèi)鏡像,直接從國內(nèi)服務器安裝依賴,這篇文章主要介紹了如何給pip更換國內(nèi)源并配置Python的國內(nèi)鏡像的相關資料,需要的朋友可以參考下
    2025-04-04
  • Python Request類源碼實現(xiàn)方法及原理解析

    Python Request類源碼實現(xiàn)方法及原理解析

    這篇文章主要介紹了Python Request類源碼實現(xiàn)方法及原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • Python?如何實現(xiàn)變量交換

    Python?如何實現(xiàn)變量交換

    這篇文章主要介紹了Python?如何實現(xiàn)變量交換,Python?程序員肯定知道?a,b?=?b,a,這句話用來交換兩個變量。相較于其它語言需要引入一個?temp?來臨時存儲變量的做法,Python?的這種寫法無疑非常優(yōu)雅,下面我們來看看具體的實現(xiàn)過程吧
    2022-01-01
  • Python用來做Web開發(fā)的優(yōu)勢有哪些

    Python用來做Web開發(fā)的優(yōu)勢有哪些

    這篇文章主要介紹了Python用來做Web開發(fā)的優(yōu)勢有哪些,文中講解非常細致,幫助大家更好的理解和學習Python,感興趣的朋友可以了解下
    2020-08-08

最新評論

大同市| 琼中| 资阳市| 资阳市| 邯郸市| 永兴县| 铜鼓县| 美姑县| 巴彦县| 揭西县| 万年县| 伊春市| 瑞丽市| 灵台县| 彭水| 晋州市| 佳木斯市| 汉寿县| 那曲县| 石嘴山市| 罗源县| 怀集县| 神农架林区| 双桥区| 胶南市| 江门市| 龙泉市| 且末县| 瓮安县| 旺苍县| 磐安县| 张北县| 三台县| 柘城县| 桃源县| 清原| 连平县| 阿勒泰市| 永平县| 科技| 瓦房店市|