標籤:sum python實現 是什麼 處理 領域 code 自然語言 前向演算法 圖片
前言
這裡的前向演算法與神經網路裡的前向傳播演算法沒有任何聯絡。。。這裡的前向演算法是自然語言處理領域隱馬爾可夫模型第一個基本問題的演算法。
前向演算法是什嗎?
這裡用一個海藻的例子來描述前向演算法是什麼。網上有關於前向演算法的嚴格數學推導,不過感覺還是海藻的例子比較好一些。網上的例子有很多都是有問題的,在本文中也都進行了相應的修正。
狀態轉移矩陣
相關性矩陣
初始狀態序列: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實現