隐藏马尔可夫模型是用于解决现实问题的概率模型,范围从每个人至少每周思考一次的问题——明天的天气会怎样?到复杂的分子生物学问题,例如预测与人类 MHC II 类分子结合的肽段 。隐藏马尔可夫模型是马尔可夫链的近亲,但它们的隐藏状态使它们成为一种独特的工具,当你对确定一系列随机变量的概率感兴趣时,可以使用它。在这篇文章中,我们将把隐藏马尔可夫模型分解为其不同的组成部分,并通过数学和 Python 代码,逐步了解哪些情绪状态导致了你的狗在训练考试中的结果。我们将使用维特比算法(Viterbi Algorithm)来确定观察到特定序列的概率,以及如何使用前向算法(Forward Algorithm)来确定观察到的序列的可能性,当你被给定一系列隐藏状态时。
现实世界充满了我们可以看到最终结果,但无法实际观察产生这些结果的潜在因素的现象。一个例子是根据过去的天气观测和不同天气结果的观察概率,预测明天是下雨还是晴天。
尽管受到我们无法观察的因素驱动,但使用隐藏马尔可夫模型可以将这些现象建模为概率系统。
带有隐藏状态的马尔可夫模型
隐藏马尔可夫模型,简称 HMM,是统计模型,作为一系列标记问题工作。这些问题描述了可观察事件的演变,这些事件本身依赖于无法直接观察的内部因素——它们是隐藏的 。
隐藏马尔可夫模型由两个不同的随机过程组成,这意味着这些过程可以被定义为随机变量的序列——这些变量依赖于随机事件。
有一个不可见的过程和一个可观察的过程。
不可见的过程是一个马尔可夫链,就像将多个隐藏状态连接在一起,随着时间的推移遍历这些状态以达到结果。这是一个概率过程,因为马尔可夫链的所有参数以及每个序列的分数实际上都是概率 。
隐藏马尔可夫模型描述了可观察事件的演变,这些事件本身依赖于无法直接观察的内部因素——它们是隐藏的 。
就像任何其他马尔可夫链一样,为了知道你接下来会进入哪个状态,唯一重要的是你现在在哪里——你当前处于马尔可夫链的哪个状态。你过去经历的所有状态的历史并不重要,以了解你接下来会去哪里。
这种短期记忆是 HMM 的关键特征之一,称为马尔可夫假设,表明到达下一个状态的概率仅依赖于当前状态的概率。
马尔可夫假设
隐藏马尔可夫模型的另一个关键特征是,它还假设每个观测值仅依赖于产生它的状态,因此,它与其他链中的任何其他状态完全独立[5]。
马尔可夫假设表明,到达下一个状态的概率仅依赖于当前状态的概率。
这些都是关于 HMM 的很好的背景信息,但它们实际上用于解决哪些类别的问题呢?
HMM 帮助建模现象的行为。除了建模和运行模拟之外,你还可以对这些现象提出不同类型的疑问:
学习导致观察到给定序列的 HMM 的参数,该序列遍历了一组特定的状态。
让我们在实践中看看!
狗的训练表现作为一个 HMM
今天,你不太担心天气预报,你更担心的是你的狗可能要从训练课程中毕业了。毕竟,经过了所有的时间、努力和狗零食,你只希望它们能成功。
在狗的训练课程中,你的四条腿的朋友被期望做一些动作或把戏,以便训练师可以观察并评估它们的表现。在结合三次试验的分数后,他们将决定你的狗是毕业还是需要额外的训练。
训练师只能看到结果,但有许多无法直接观察的因素,例如,你的狗是否累了、是否开心,或者它们是否不喜欢训练师或周围的其他狗。
除非你的狗在感到某种情绪时会做出某种特定的动作,否则这些都无法直接观察到。如果它们能用语言表达自己的感受就好了,也许在未来会实现!
有了隐藏马尔可夫模型的新知识,这看起来像是一个预测你的狗在考试期间情绪的绝佳机会。它们可能会因为感到疲倦而得到某个分数,也许是因为它们饿了,或者是因为它们对训练师感到厌烦。
你的狗已经上课有一段时间了,根据在训练期间收集的数据,你拥有了构建隐藏马尔可夫模型所需的所有要素。
为了构建一个模拟你的狗在训练评估中表现的 HMM,你需要:
隐藏状态是那些影响观测序列的不可观测因素。你只考虑你的狗是疲倦还是开心。
不同隐藏状态的 HMM
非常了解你的狗,那些可能影响它们考试表现的不可观测因素仅仅是疲倦或开心。
接下来,你需要知道从一个状态转移到另一个状态的概率,这在转移矩阵中被捕获。这个矩阵还必须是行随机的,这意味着从一个状态到链中的任何其他状态的概率,即矩阵的每一行,必须加起来等于一。
转移矩阵:表示从一个状态转移到另一个状态的概率
无论你正在解决什么类型的问题,你总是需要一个观测序列。每个观测值代表遍历马尔可夫链的结果。每个观测值都来自一个特定的词汇表。
词汇表
在你狗的考试中,你观察到它们在每次试验后得到的分数,可以是失败、一般或完美。这些是观测词汇表中所有可能的术语。
你还需要观测似然矩阵,这是从特定状态生成观测值的概率。
观测似然矩阵
最后,还有初始概率分布。这是马尔可夫链从每个特定隐藏状态开始的概率。
在马尔可夫链中,有些状态永远不会是起始状态。在这种情况下,它们的初始概率为零。就像转移矩阵中的概率一样,所有初始概率的总和也必须加起来等于一。
初始概率
初始概率分布,连同转移矩阵和观测似然,构成了 HMM 的参数。这些是你试图弄清楚的概率,如果你有一个观测序列和隐藏状态,并试图学习哪个特定的 HMM 可能生成了它们。
将所有这些部分放在一起,这就是代表你的狗在训练考试中表现的隐藏马尔可夫模型的样子。
隐藏状态及其之间的转移概率
在考试中,你的狗将进行三次试验,只有在两次试验中没有失败的情况下,它们才会毕业。
到头来,即使你的狗需要更多的训练,你也会同样照顾它们。你脑海中真正的问题是:它们在考试期间感觉如何?
想象一个场景,它们以“一般——失败——完美”的顺序毕业,它们的情绪状态序列会是什么?它们会一直感到疲倦,还是会一直感到饥饿,或者可能是两者的混合?
这种类型的问题正好属于 HMM 可以应用的解码问题。在这种情况下,你感兴趣的是找出生成特定观测序列“一般——失败——完美”的最佳状态序列。
解码生成给定观测序列的状态序列问题利用了维特比算法(Viterbi Algorithm)。然而,在深入研究维特比算法之前,值得先了解一下如何使用前向算法(Forward Algorithm)计算给定观测序列的概率——这是一个可能性任务。这将有助于更好地理解维特比算法的工作原理。
前向算法
如果你像处理一个普通的马尔可夫链那样建模这个问题,并且想要计算观测到“一般、失败、完美”这一序列的可能性,你会通过进入每个产生期望结果的特定状态来遍历链。在每一步中,你会取观测到当前结果的条件概率(假设你已经观测到了之前的结果),并将该概率乘以从一个状态转移到另一个状态的转移概率。
最大的区别在于,在普通的马尔可夫链中,所有状态都是众所周知且可观察的。而在隐藏马尔可夫模型中并非如此!在隐藏马尔可夫模型中,你观测到的是一系列结果,而不知道为了观测到这些结果而必须遍历的特定隐藏状态序列。
此时,你可能会想:“好吧,我只需要遍历所有可能的路径,最终会有一个规则来选择等效路径。”这种方法的数学定义大致如下:
计算观测到一系列结果的概率,遍历所有可能的隐藏状态序列
这确实是一种策略!你将不得不计算“一般、失败、完美”这一序列对于所有可能生成该序列的隐藏状态组合的概率。
当隐藏状态的数量和观测序列的长度足够小时,可以在合理的时间内完成这种计算。
hmm中可能的路径的概述
幸运的是,你刚刚定义的隐藏马尔可夫模型相对简单,只有3个观测结果和2个隐藏状态。
对于长度为L的观测序列,在具有M个隐藏状态的HMM中,你有“M的L次方”种可能的状态。在你的例子中,这意味着2的3次方,即8种可能的路径用于序列“一般——失败——完美”,涉及的计算复杂度呈指数增长,为O(M^L L),用大O符号表示。随着模型复杂度的增加,你需要考虑的路径数量呈指数级增长。
随着模型复杂度的增加,你需要考虑的路径数量呈指数级增长。
这就是前向算法的亮点所在。
前向算法可以在不需要计算构成该序列的所有可能路径的概率的情况下,计算观测序列中一个新符号的概率 。
该算法不是计算构成该序列的所有可能路径的概率,而是定义了前向变量并递归地计算其值。
前向变量是如何递归计算的
该算法使用递归是其比计算所有可能路径的概率更快的关键原因。实际上,它可以在仅进行“L乘以M的平方”次计算的情况下,计算观测到序列x的概率,而不是“M的L次方乘以L”。
在你的例子中,有2个隐藏状态和3个观测结果的序列,这意味着计算概率的次数从O(M^L L)=2^3×3=8×3=24次减少到O(L M^2)=3×2^2=3×4=12次。
通过动态规划(Dynamic Programming)实现了计算次数的减少。动态规划是一种编程技术,它使用辅助数据结构来存储中间信息,从而确保相同的计算不会多次进行。
每次算法准备计算一个新的概率时,它都会检查是否已经计算过该概率,如果是,它可以从中间数据结构中轻松获取该值。否则,将计算该概率并将值存储起来。
我们回到你的解码问题,使用维特比算法。
维特比算法
用伪代码来思考,如果你想强行解码生成特定观测序列的隐藏状态序列,你所需要做的就是:
使用前向算法计算每个可能的隐藏状态序列对应的观测序列的可能性;
生成观测序列“一般——失败——完美”的所有可能的隐藏状态序列
对于你的特定 HMM,有8条可能的路径会导致“一般——失败——完美”的结果。只要再增加一个观测,可能的隐藏状态序列的数量就会翻倍!与前向算法所描述的类似,你很容易就会得到一个复杂度呈指数增长的算法,并且会遇到性能瓶颈。
维特比算法在这方面为你提供了帮助。
当 HMM 中的隐藏状态序列被遍历时,在每一步中,概率 vt(j) 是在观察到观测结果后,HMM 处于隐藏状态 j 的概率,并且是通过导致 j 的最可能状态来遍历的。
时间步 t 时通往隐藏状态 j 的维特比路径
解码生成特定观测序列的隐藏状态序列的关键在于这个最可能路径的概念。也被称为维特比路径,最可能路径是从所有可能导致任何给定隐藏状态的路径中,可能性最高的路径。
解码生成特定观测序列的隐藏状态序列的关键在于使用维特比路径。通往任何给定隐藏状态的最可能路径。
你可以在前向算法和维特比算法之间画出一个类比。前向算法通过汇总所有概率来获得到达某个状态的可能性,同时考虑所有导致该状态的路径,而维特比算法并不想探索所有可能性。它专注于通往任何给定状态的最可能路径。
回到解码导致考试成绩“一般——失败——完美”的隐藏状态序列的任务中,手动运行维特比算法的过程如下:
维特比路径和解码序列
维特比算法的另一个独特之处在于,它必须有一种方法来跟踪通往任何给定隐藏状态的所有路径,以便比较它们的概率。为此,它使用动态规划算法中典型的辅助数据结构,为每个隐藏状态保留回溯指针。这样,它就可以轻松访问过去遍历过的任何维特比路径的概率。
回溯指针是确定通往观测序列的最可能路径的关键。
在你的狗的考试例子中,当你计算维特比路径 v3(开心)和 v3(疲倦)时,你会选择概率最高的路径,然后开始向后追溯,即回溯,通过所有导致你当前状态的路径。
Python 中的维特比算法
手动完成所有这些计算既耗时又容易出错。错过一个重要的数字,你可能不得不从头开始,重新检查所有概率!
好消息是,你可以利用像 hmmlearn 这样的软件库,通过几行代码就可以解码导致你的狗在试验中以“一般——失败——完美”的顺序毕业的隐藏状态序列。
from hmmlearn import hmm import numpy as np## 第一部分:生成具有特定参数的 HMM 并模拟考试 print ('设置具有参数的 HMM 模型' )# init_params 是用于初始化模型以进行训练的参数 # s -> 起始概率 # t -> 转移概率 # e -> 发射概率 model = hmm.CategoricalHMM(n_components=2, random_state=425, init_params='ste' )# 起始概率 # 从疲倦状态开始的概率 = 0.1 # 从开心状态开始的概率 = 0.9 initial_distribution = np.array([0.1, 0.9]) model.startprob_ = initial_distributionprint ('步骤 1 完成 - 定义了起始分布' )# 转移概率 # 疲倦 开心 # 疲倦 0.4 0.6 # 开心 0.2 0.8 transition_distribution = np.array([[0.4, 0.6], [0.2, 0.8]]) model.transmat_ = transition_distributionprint ('步骤 2 完成 - 定义了转移矩阵' )# 观测概率 # 失败 一般 完美 # 疲倦 0.3 0.5 0.2 # 开心 0.1 0.5 0.4 observation_probability_matrix = np.array([[0.3, 0.5, 0.2], [0.1, 0.5, 0.4]]) model.emissionprob_ = observation_probability_matrixprint ('步骤 3 完成 - 定义了观测概率矩阵' )# 模拟进行 100,000 次试验,即能力测试 trials, simulated_states = model.sample(100000)# 输出模拟试验的样本 # 0 -> 失败 # 1 -> 一般 # 2 -> 完美 print ('\n模拟试验样本 - 基于模型参数' )print (trials[:10])## 第二部分 - 解码导致观测序列为“一般 - 失败 - 完美”的隐藏状态序列 # 将数据分为训练集和测试集(50/50 分割) X_train = trials[:trials.shape[0] // 2] X_test = trials[trials.shape[0] // 2:] model.fit(X_train)# 考试有 3 次试验,你的狗得到了以下成绩:一般,失败,完美(1, 0, 2) exam_observations = [[1, 0, 2]] predicted_states = model.predict(X=[[1, 0, 2]])print ('预测考试成绩为一般,失败,完美的隐藏状态转换:\n 0 -> 疲倦, 1 -> 开心' )print (predicted_states)
在几秒钟内,你就会得到一个与手动计算结果相匹配的输出,速度更快且出错的可能性更小。
运行上述代码的输出结果
总结
隐藏马尔可夫模型(HMM)的迷人之处在于,这种在 20 世纪 60 年代中期[6]创建的统计工具如此强大,并且适用于如此不同领域的现实问题,从天气预报到寻找句子中的下一个词。
在这篇文章中,你有机会了解 HMM 的不同组成部分,它们如何应用于不同类型的任务,并发现前向算法和维特比算法之间的相似之处。这两个非常相似的算法都使用动态规划来处理涉及的指数级计算。
无论是手动进行计算,还是将参数输入到 TensorFlow 代码中,希望你享受深入探索 HMM 世界的过程。
感谢阅读!
References
D. Khiatani and U. Ghose, “Weather forecasting using Hidden Markov Model,” 2017 International Conference on Computing and Communication Technologies for Smart Nation (IC3TSN), Gurgaon, India, 2017, pp. 220–225, doi: 10.1109/IC3TSN.2017.8284480.
Noguchi H, Kato R, Hanai T, Matsubara Y, Honda H, Brusic V, Kobayashi T. Hidden Markov model-based prediction of antigenic peptides that interact with MHC class II molecules. J Biosci Bioeng. 2002;94(3):264–70. doi: 10.1263/jbb.94.264. PMID: 16233301.
Yoon BJ. Hidden Markov Models and their Applications in Biological Sequence Analysis. Curr Genomics. 2009 Sep;10(6):402–15. doi: 10.2174/138920209789177575. PMID: 20190955; PMCID: PMC2766791.
Eddy, S. What is a hidden Markov model?. Nat Biotechnol 22, 1315–1316 (2004). https://doi.org/10.1038/nbt1004-1315
Jurafsky, Dan and Martin, James H.. Speech and language processing : an introduction to natural language processing, computational linguistics, and speech recognition. Upper Saddle River, N.J.: Pearson Prentice Hall, 2009.
Baum, Leonard E., and Ted Petrie. “Statistical Inference for Probabilistic Functions of Finite State Markov Chains.” The Annals of Mathematical Statistics 37, no. 6 (1966): 1554–63.
文章来源:https://medium.com/data-science/hidden-markov-models-explained-with-a-real-life-example-and-python-code-2df2a7956d65
转自:我得学诚