前言
这里的前向算法与神经网络里的前向传播算法没有任何联系。。。这里的前向算法是自然语言处理领域隐马尔可夫模型第一个基本问题的算法。
前向算法是什么?
这里用一个海藻的例子来描述前向算法是什么。网上有关于前向算法的严格数学推导,不过感觉还是海藻的例子比较好一些。网上的例子有很多都是有问题的,在本文中也都进行了相应的修正。
状态转移矩阵
相关性矩阵
初始状态序列: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值,然后就得到了对应的最大可能的隐藏序列。而求和的话,则可以得到对应的标记序列的出现可能性。
原文地址:https://www.cnblogs.com/zhenlingcn/p/8410042.html
时间: 2024-10-11 12:06:18