机器学习之隐形马尔科夫模型HMM

本文总结机器学习中的隐形马尔科夫模型,该模型主要应用于一些预测领域,列举一些相关的算法与模型,自我学习

01

什么是熵

    熵是表示物质系统状态的一种度量,用它来表征系统的无序程度。该词最早出现在化学领域,只记得当年化学的一些基本常识,化学反应根据布斯自由能来判定是否能进行,熵减反应容易自发,比如氧化,熵增反应需要加热或者通电,需要额外的能量,当然也不全是,这里主要想表明熵增减都是混乱度的增减。熵越大,系统越无序,意味着系统结构和运动的不确定和无规则;反之,熵越小,系统越有序,意味着具有确定和有规则的运动状态。

02

最大熵模型

    最大熵(Maximum Entropy)模型,就是要保留全部的不确定性,将风险降低到最小。

    匈牙利兄弟--著名数学家,信息论最高奖香农奖希萨(Csiszar)证明,对于任何一组不自相矛盾的信息,这个最大熵不仅存在,而且是唯一的。且他们都有同一个非常简单的形式-指数函数。公式如下:
image
     从上公式可以看到,有几个参数lambda和Z参数,他们需要通过观测数据  训练出来,最大熵模型在形式上是最漂亮的统计模型,而在实现上是最复杂的模型之一。

GIS(generalized iterative scaling)通用迭代算法

    最大熵模型的参数训练方法是通过GIS训练出来的,过程如下:

  • 假定第零次迭代的初始模型为等概率的均匀分布。

  • 用第N次迭代的模型来估算每种信息特征在训练数据中的分布,如果超过了实际的,就把相应的模型参数变小;否则,将他们变大。

  • 重复步骤2,直到收敛。

    这个算法每次迭代的时间都很长,需要迭代的次数很多,而且不太稳定。因此实际中很少被使用。
    

IIS(Improved Iterative Scaling)改进的迭代算法

    改进的GIS,由天才孪生兄弟达拉皮垂(Della Pietra)提出。虽然它使得最大熵模型的训练时间缩短了一到两个数量级,但是计算量依旧很大。在实际信息处理应用中,验证了最大熵模型优势的应用是:拉纳帕提在词性标注和句法分析的应用,做出了当时世界上最好的词性标注系统和句法分析器。

    IIS算法虽然有改进训练时间,但是最大熵模型的计算量依旧是个拦路虎。

03

HMM隐马尔科夫模型

    HMM(Hidden Markov Model)是一种统计模型,它用来描述一个含有隐含未知参数的马尔科夫过程。其难点在于从可观察的参数中确定该过程的隐含参数,然后利用这些参数进一步的分析。如模式识别,它是在建模系统中被认为是一个马尔科夫过程和未观测到状态的统计马尔科夫模型。

    在隐马尔科夫模型中,我们不仅有一串可见状态链,还有一串隐含状态链。

    一般来说,HMM中说到的马尔科夫链是指隐含的状态链,因为隐含状态之间存在转换概率(Transition Probability)。这个转换概率其实我们是可以随意设定的。

 同样的,尽管可见状态之间没有转换概率,但是隐含状态和可见状态之间有一个概率叫做输出概率(Emission Probability)。同样的,我们也可以对这个概率进行其他定义。 
image
    其实,如果提前知道所有隐含状态之间的转换概率和所有隐含状态到所有可见状态之间的输出概率,做模拟是相当容易的,但是在实际应用,往往是丢失一部分信息的。

    和HMM模型相关的算法主要分为三类,分别解决三个问题。 

  • 知道骰子有几种(隐含状态数量),每种骰子是什么(转换概率),根据掷骰子掷出的结果(可见状态链),我想知道掷出来的都是哪种骰子(隐含状态链)。

    第一种解法求最大似然状态路径,就是我求一串骰子序列,这串筛子序列产生观测结果的概率最大。第二种解法不是求一组骰子序列,而是求每次掷出骰子分别是某种骰子的概率。

  • 知道骰子有几种(隐含状态数量),每种骰子是什么(转换概率),根据掷骰子掷出的结果(可见状态链),我想知道掷出这个结果的概率

    检测观察到的结果和已知的模型是否吻合。

  • 知道骰子有几种(隐含状态数量),每种骰子是什么(转换概率),根据掷骰子掷出的结果(可见状态链),我想反推出每种骰子是什么(转换概率)。

    这是最常见的问题,很多时候我们只知道结果,不知道模型里的参数,需要从模型里估计参数,建模的必要步骤。

  • 看见不可见的,破解骰子序列

    解最大似然路径问题,著名的算法Viterbi algorithm。

    例:有3个骰子,四面骰子D4,六面骰子D6,八面骰子D8。投了10次结果是(1,6,3,5,2,7,3,5,2,4)我们不知道每次用了那个骰子,我想知道最有可能的骰子序列。

    看到结果1,对应最大的概率就是D4.很简单,但是结果为1,6时,变得复杂,要计算三个值,分别是第二个骰子是D6,D4,D8的最大概率,显然第一个骰子必须是D4,要想概率最大第二个为D6。

    同样的,计算第三个骰子是D4,D6或D8的概率,依次类推。我们要求最大概率骰子序列需要这么几件事情,首先,不管序列多长,要从序列为1算起,算序列长度为1时取到的最大概率。然后,

    逐渐增加长度,每增加一次长度,重新算一遍这个长度下最后一个位置取到每个骰子的最大概率。因为上一个长度下的取到每个骰子的最大概率都算过了,重新计算也不难。当计算到最后一位时,

    就知道最后一位时哪个骰子的概率最大。我们要把对应这个最大概率的序列从后往前推出来。

  • 谁动了我的骰子

    这回,我们不挑最大值了,而是把所有算出来的概率相加,得到的总概率就是我们要求的结果,依然不能用于太长的骰子序列。这个算法叫做前向算法(forward algorithm).

    如:看到结果为1,产生这个结果的总概率可以按照如下计算,总概率为0.18

    image

    同样的,看到结果为1,6的总概率可以按照如下计算,总概率为0.05
    image

    最后,再长的马尔科夫链总能算出来的,用同样的算法,也可以算出不正常骰子的概率,然后我们比较一下这两个骰子概率的大小,就能知道你的骰子是否被换了.

04

维特比算法

任何一个隐马尔科夫模型都可以通过下面这个五元组描述:

:param obs:观测序列

:param states:隐状态

:param start_p:初始概率(隐状态)

:param trans_p:转移概率(隐状态)

:param emit_p: 发射概率 (隐状态表现为显状态的概率)

image

05

前向算法

  • 穷举搜索

     给定一个HMM,我们想计算出某个可观察序列的概率,考虑天气的例子,我们知道一个描述天气和和海藻状态的HMM,而且我们还有一个海藻状态的序列。假设这个状态中的某三天是(dry,damp,soggy),在这三天中,天气都可能是晴朗,多云或下雨。我们可以用下图来表示观察序列和隐藏序列。
    
image
    在这图中的每一列表示天气的可能性,并且每个状态都指向相邻列的每个状态,每个状态在状态转移矩阵中都有一个概率。每一列下面是当天的可观察的海藻的状态,在每种状态下出现这种可观察状态的概率是由混淆矩阵给出的。一个可能的计算可观察概率的方法是找到每一个可能的隐藏状态的序列,共有3^3=27种,这个时候的可观察序列的概率就是

       Pr(dry, damp, soggy | HMM)=Pr(dry, damp, soggy | sunny, sunny, sunny) + . . . . + Pr(dry, damp, soggy | rainy, rainy, rainy)

      显然这个计算效率非常低,尤其是当模型中的状态很多或者序列很长的时候,事实上,我们可以利用概率不随时间变化这个假设来降低时间的开销。
  • 使用递归来降低维度、

    我们可以考虑给定HMM的情况下,递归的计算一个可观察序列的概率,我们首先定义一个部分概率,表示达到某个中间状态的概率,接下来看到这些部分概率是如何在time=1和time=n的时候计算的。
    
    假设一个T时间段的可观察序列是:
    
image

部分概率

下面这张图表示了一个观察序列(dry,damp,soggy)的一阶转移

           ![image](http://upload-images.jianshu.io/upload_images/4767334-11546d44fe998c10?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

    我们可以通过计算到达某个状态的所有路径的概率和来计算到达某个中间状态的概率。比如说,t=2时刻,cloudy的概率用三条路径的概率之和来表示:

      ![image](http://upload-images.jianshu.io/upload_images/4767334-4185e56ccbd108fd?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

    我们用at(j)来表示在t时刻是状态j的概率,at(j) =Pr(观察状态|隐藏状态)xPr(t时刻到达状态j的所有路径),最后一个观察状态的部分概率就表示了整个序列最后达到某个状态的所有可能的路径的概率和。比如在这个例子中,最后一列的部分状态是通过下列路径计算得到的:

           ![image](http://upload-images.jianshu.io/upload_images/4767334-c2f4375e9e304edf?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

    因为最后一列部分概率是所有可能路径的概率和,所有就是这个观察序列在给定HMM下的概率了。

计算t=1时候的部分概率

    当t=1时候,没有路径到达某个状态,所以这里就是初始概率:

                ![image](http://upload-images.jianshu.io/upload_images/4767334-86dbb0a0d7b57fa1?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

    因为在初始的时候,状态j的概率不仅和这个状态本身相关,还和观察状态有关,所以这里用到了混淆矩阵的值,k1表示第一个观察状态,bjk1表示隐藏状态是j,但是观察成k1的概率。

计算t>1时候的部分概率

    部分概率的公式:at(j) =Pr(观察状态|隐藏状态)xPr(t时刻到达状态j的所有路径)。这个公式的左边是从混淆矩阵中已知的,只需要计算右边的部分,很显然右边是所有路径的和。

      ![image](http://upload-images.jianshu.io/upload_images/4767334-73dea92a487684c6?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

    需要计算的路径数是和观察序列的长度的平方相关的,但是t时刻的部分概率已经过了之前的所有路径。所以在t+1时刻只需要根据t时刻的概率来计算就可以了。

公式推导

image

06

总结

    隐型马尔科夫模型主要是一些参数模型的训练,概率的转移,其中涉及矩阵的计算,迭代的部分比较繁琐。整体上还是比较简单有趣,数学部分也没有那么艰深晦涩难懂。欢迎留言或者留下你想看的,我可以作为你的知识接单人,为你解答先行。

如果对笔者的文章感兴趣 可以搜寻公众号"菜叶头",关注留言

你可能感兴趣的:(机器学习之隐形马尔科夫模型HMM)