如果你跟夕小瑶恋爱了...(下)
在上一篇文章中,你成功的将“挽回夕小瑶”的任务卡进了隐马尔可夫模型(HMM)中。那么我们来规范化的整理一下已经有的信息和需要计算得到的信息。
还记得这两个图嘛?这就是我们建立好的模型。
(隐状态的转移图)
(每个隐状态ωi都有概率发出5种可以观测到的信号)
对于第一张图,这么多的参数看起来也蛮乱的,那就将所有的状态转移概率aij存储到一个矩阵A中:
矩阵A中的每个元素aij就代表当前状态为ωi时,下一状态为ωj的概率(即状态ωi到状态ωj的转移概率)。
对于第二张图,描述的是当(隐)状态为ωj时,发出信号vk的概率。所以用bjk来表示ωj发出信号vk的概率。将bjk存储到矩阵B中:
好~A矩阵和B矩阵显然就是我们需要计算出的模型参数啦。但是参数中仅仅是A和B就够了吗?
想一下,虽然A可以描述从某个状态转移到某个状态的概率,但是每个状态序列总要有一个开头呀~这个开头是什么样子的,在A矩阵和B矩阵中都没有描述。
所以模型还有一个描述初始状态的参数,也就是描述每个隐状态ωi作为初始状态的概率,记为πi。也就是向量π:
整理完毕~A、B、π就是我们全部要计算出的模型参数。
而我们已经有了夕小瑶好多天的隐状态序列和对应的观测序列的数据了,那么我们如何用它们来训练出模型的参数呢。
其实这样就很简单很简单啦,直接搬出似然函数,找出使得似然函数最大的参数值嘛,也就是最大化似然函数。
顾名思义,“然”是这样的意思,所以似然函数就是用来描述当前的模型参数取值的合理性,间接反映当前模型参数对手中数据集的解释程度,因此使得似然函数最大,意思就是使得模型参数取的最合理,使得手中数据集在模型的解释下变得合理。
你陪小夕度过了300天。因此你记录下了300段隐状态序列,记为
Q=q1 q2 q3 ... qT(其实qi就是之前表示的ωi),其中T=6(每天经历6个时间点,化妆-吃饭-聊天-自习-上课-要抱抱)。
同时对应着300段观测序列,记为:
O=O1 O2 O3 ... OT,同样T=6。
然后根据极大似然估计的思想,直接用样本集估计出HMM的各个参数啦。
所以HMM的各个参数应该这样估计:
这样我们就得到了所有的模型参数(向量π、矩阵A、矩阵B)。
看,由此,我们轻而易举的把夕小瑶这个隐马尔可夫模型建立完成了。
有了这个模型,我们就完全看透夕小瑶了!所以,下面开始得到本任务的最终目标——预测夕小瑶在耍小脾气当天的情绪状态序列(隐状态序列)!
量化一下我们要做的事情:在给定HMM模型(即已知全部参数的HMM模型,记为μ)和观测序列O情况下,求最大概率的(隐)状态序列:
怎么计算呢?Viterbi算法!
这个算法有点绕,直接贴出来,如果直接看看不懂的话可以看后面小夕的解释哦。
这个算法的思想就是设立一个小人δ(读作delta),这个小人从时刻1,一直走到时刻T。
这个小人的意义就是记录下自己在每个时间点t的每个隐状态j的概率(注意不是从全局的观测序列计算出的概率,是他自己从t=1的时刻一步步的观察每个时刻的观测值所得到的那一时刻的累积概率)
算法的第一步:初始化这个小人,利用已知的模型参数πi和bi(O1)(即状态i下,发出观测值O1的概率,其中O1为t=1时刻的观测值)得到t=1时刻每个隐状态i的δ值。
第二步:这个小人在每个时刻t都会将每个隐状态里呆一会。在每个隐状态j里,它都会抬头看看此刻的观测值Ot,并分别假设自己处于前一时刻t-1的每个隐状态i中,并用前一时刻t-1假设的隐状态的累计概率值乘以前一时刻假设的隐状态转移到当前时刻的当前隐状态的转移概率,然后算出使得当前时刻的当前隐状态的总概率最大化的前一时刻的隐状态,这个最优隐状态记为m吧。这个前一时刻的最优隐状态的累积概率δt-1(m)乘以前一时刻m状态转移到当前时刻的当前j状态的转移概率,再乘以当前时刻t的当前状态j发出观测值Ot的概率,即为δt(j)。
第三步:小人δ走完最后一个时刻T的最后一个隐状态后,就可以从最后时刻的全部隐状态中挑出最后时刻,也就是全局的最大累积概率δT啦,记下这个最大概率对应的隐状态QT
第四部:一步步的回溯呀,记下T时刻走到最优隐状态QT的前一时刻的最优隐状态(回顾一下第二步),得到前一时刻最优隐状态QT-1。然后同样,再往前回溯得到QT-2,一直回溯到Q1!然后Q1Q2Q3..QT就是全局最优隐状态序列啦!也就是夕小瑶耍小脾气时的情绪状态序列!
在你猜出后,夕小瑶瞬间(被自己)感动哭了...(内心os:竟然花了这么大的功夫教你怎么猜我的心思...还不如直接告诉你呢嘤嘤嘤...