1. 程式人生 > >前向算法Python實現

前向算法Python實現

基本 是什麽 比較 down 第一天 什麽 可能性 馬爾可夫模型 完全

前言

這裏的前向算法與神經網絡裏的前向傳播算法沒有任何聯系。。。這裏的前向算法是自然語言處理領域隱馬爾可夫模型第一個基本問題的算法。

前向算法是什麽?

這裏用一個海藻的例子來描述前向算法是什麽。網上有關於前向算法的嚴格數學推導,不過感覺還是海藻的例子比較好一些。網上的例子有很多都是有問題的,在本文中也都進行了相應的修正。
狀態轉移矩陣
技術分享圖片
相關性矩陣
技術分享圖片
初始狀態序列:Sunny(0.63),Cloudy(0.17),Rainy(0.20)
我們想要求一個觀察序列{Dry, Damp, Soggy}的概率。
具體怎麽求這個概率,數學上有嚴格的推導流程,這裏不再進行闡述,這裏僅針對前向算法進行闡述。

前向算法的Python實現

前向算法的問題盡管看起來和維特比算法解決的問題不太一樣,但是套路實際上是完全相同的。
首先可以利用numpy將數據加入到python代碼中

import numpy as np
# 前向算法
tran = np.array([[0.5, 0.375, 0.125],
                 [0.25, 0.125, 0.625],
                 [0.25, 0.375, 0.375]])
laun = np.array([[0.6, 0.2, 0.15, 0.05],
                 [0.25, 0.25, 0.25, 0.25],
                 [0.05
, 0.1, 0.35, 0.5]]) init = np.array([0.63, 0.17, 0.2]) look = np.array([0, 2, 3]) # 觀測序列 kind = [‘Sunny‘, ‘Cloudy‘, ‘Rainy‘]

P(第一天海藻狀態為0&晴天)=P(海藻狀態為0|晴天)P(晴天|初始狀態)
這樣的話,便可以把第一天海藻狀態為0的情況下,晴天、多雲、雨天的概率都算出來。
P(第二天海藻狀態為2&晴天)=(P(第一天海藻狀態為0|晴天)
P(今天晴天|前一天為晴天)+P(第一天海藻狀態為0|雨天)P(今天晴天|前一天為雨天)+P(第一天海藻狀態為0|陰天)P(今天晴天|前一天為陰天))*P(海藻為2|晴天)
這個算是用python代碼寫下來的話如下所示:

dp[j] = sum(np.array([a * b for a, b in zip(temp, tran[:,j])]))*laun[j,look[i]]

完整代碼如下:

dp = np.array([a * b for a, b in zip(init, laun[:, look[0]])])
for i in range(1,3):
    temp = np.copy(dp)
    for j in range(3):
        dp[j] = sum(np.array([a * b for a, b in zip(temp, tran[:,j])]))*laun[j,look[i]]
print(sum(dp))

可以發現,這段代碼與維特比算法的代碼基本完全相同,只不過最後利用的方式不同,維特比算法是求出了最大的dp值,然後就得到了對應的最大可能的隱藏序列。而求和的話,則可以得到對應的標記序列的出現可能性。

前向算法Python實現