机器学习_4.隐马尔可夫模型初识

预备知识——熵

隐马尔可夫模型是从统计的基础上发展起来的,因此首先需要掌握以下几点:

  1. 熵是表示物质系统状态的一种度量,用以表示系统的无序程度,也可称不确定性程度。在信息论中,香农使用熵来表示信息系统的平均信息量,即平均不确定程度。
  2. 最大熵原理是一种选择随机变量统计特性最符合客观情况的准则,也称为最大信息原理。随机量的概率分布是很难测定的,一般只能测得其各种均值(如数学期望、方差等)或已知某些限定条件下的值(如峰值、取值个数等),符合测得这些值的分布可有多种、以至无穷多种,通常,其中有一种分布的熵最大。选用这种具有最大熵的分布作为该随机变量的分布,是一种有效的处理方法和准则。这种方法虽有一定的主观性,但可以认为是最符合客观情况的一种选择。在投资时常常讲不要把所有的鸡蛋放在一个篮子里,这样可以降低风险。在信息处理中,这个原理同样适用。在数学上,这个原理称为最大熵原理。(百度百科)
  3. 最大熵是形式上最漂亮但实现最复杂的模型之一,在此方面专家们进行了各种尝试,创建了各种算法和最大熵模型,研究仍在进行中。

马尔可夫

马尔可夫(1856~1922),苏联数学家。切比雪夫的学生。在概率论、数论函数逼近论和微分方程等方面卓有成就。他的主要著作有《概率演算》等。在数论方面,他研究了连分数和二次不定式理论 ,解决了许多难题 。在概率论中,他发展了矩法,扩大了大数律和中心极限定理的应用范围。马尔可夫最重要的工作是在1906~1912年间,提出并研究了一种能用数学分析方法研究自然过程的一般图式——马尔可夫链。同时开创了对一种无后效性的随机过程——马尔可夫过程的研究。马尔可夫经多次观察试验发现,一个系统的状态转换过程中第n次转换获得的状态常决定于前一次(第n-1次)试验的结果。马尔可夫进行深入研究后指出:对于一个系统,由一个状态转至另一个状态的转换过程中,存在着转移概率,并且这种转移概率可以依据其紧接的前一种状态推算出来,与该系统的原始状态和此次转移前的马尔可夫过程无关。马尔可夫链理论与方法已经被广泛应用于自然科学、工程技术和公用事业中。

马尔可夫链

其为在数学中具有马尔可夫性质的离散时间随机过程,在给定当前知识或信息的情况下,过去(即当前以前的历史状态)对于预测将来(即当前以后的未来状态)是无关的。

马尔可夫链是随机变量X1,X2,X3…的一个数列。这些变量的范围,即他们所有可能取值的集合,被称为“状态空间”,而Xn的值则是在时间n的状态。如果Xn + 1对于过去状态的条件概率分布仅是Xn的一个函数,则

P(Xn+1=x∣X0,X1,X2,…,Xn)=P(Xn+1=x∣Xn)

时间和状态都是离散的马尔可夫过程称为马尔可夫链, 简记为Xn=X(n),n=0,1,2…

这里x为过程中的某个状态。上面这个恒等式可以被看作是马尔可夫性质。

隐马尔可夫模型(HMM)

马尔可夫模型马尔可夫链的一种,它的状态不能直接观察到,但能通过观测向量序列观察到,每个观测向量都是通过某些概率密度分布表现为各种状态,每一个观测向量是由一个具有相应概率密度分布的状态序列产生。所以,隐马尔可夫模型是一个双重随机过程----具有一定状态数的隐马尔可夫链和显示随机函数集。自20世纪80年代以来,HMM被应用于语音识别,取得重大成功。到了90年代,HMM还被引入计算机文字识别和移动通信核心技术“多用户的检测”。HMM在生物信息科学、故障诊断等领域也开始得到应用。

可以用五个元素来描述,包括2个状态集合和3个概率矩阵: 隐含状态 S、可观测状态 O、初始状态概率矩阵 π、隐含状态转移概率矩阵 A。、观测状态转移概率矩阵 B (英文名为Confusion Matrix,直译为混淆矩阵不太易于从字面理解)。一般的,可以用λ=(A,B,π)三元组来简洁的表示一个隐马尔可夫模型。隐马尔可夫模型实际上是标准马尔可夫模型的扩展,添加了可观测状态集合和这些状态与隐含状态之间的概率关系。

一个含有 N 个状态的一阶过程有 N2 个状态转移。每一个转移的概率叫做状态转移概率 (state transition probability),就是从一个状态转移到另一个状态的概率。这所有的 N2 个概率可以用一个状态转移矩阵来表示,其表示形式如下:

约束条件为:

在模型的构建中,难点是从可观察的参数中确定该过程的隐含参数。然后利用这些参数来作进一步的分析,例如模式识别。

对 HMM 来说,有如下三个重要假设,尽管这些假设是不现实的。

  

  假设1:马尔可夫假设(状态构成一阶马尔可夫链)

  假设2:不动性假设(状态与具体时间无关)

  假设3:输出独立性假设(输出仅与当前状态有关)

  隐藏的状态和可观察到的状态之间有一种概率上的关系,也就是说某种隐藏状态 H 被认为是某个可以观察的状态 O1 是有概率的,假设为 P(O1 | H)。如果可以观察的状态有3种,那么很显然 P(O1 | H)+P(O2 | H)+ P(O3 | H) = 1

  这样,我们也可以得到一个另一个矩阵,称为混淆矩阵 (confusion matrix)。这个矩阵的内容是某个隐藏的状态被分别观察成几种不同的可以观察的状态的概率

举个例子:

假设,小明在教学楼里,他随机去1、2、3三层楼里的房间,其中一楼只有101、102、……、110十个房间,二楼有201、……、212十二个房间,三楼有301、……、314十四个房间。在同一层楼中,去每个房间都是等概率的,即一楼每个教室都是1/10,二楼每个教室都是1/12,三楼每个教室都是1/14。并且从一层楼前往其他任一层楼的概率都是1/3。如果我们只考虑房间号,则小明随机进入房间,会有1、2、3、4、5、6、7、8、9、10、11、12、13、14中的一个。不停的重复,则会得到房间号组成的字符串。

实验十次,我们可能会得到:1 3 5 7 3 10 13 2 1 6,这种可见的链即为可见状态链,对应的还有一串隐含状态链,此时即为十次中去的房间所在楼层如:L1、L3、L2、L3、L1、L3、L3、L3、L1、L2。HMM中说到的马尔可夫链其实是指隐含状态链,因为隐含状态(楼层)之间存在转换概率(transition probability)。而如果楼层之间转换的概率是不同的,那么就会产生新的HMM。而在实际应用中,往往上述的信息并没有那么全面,因此就要使用算法去估计这些缺失值。

HMM相关算法主要聚焦于以下三种问题:

  1. 在已知隐含状态数量、隐含状态之间的转移概率,根据可见状态链求隐含状态链;
  2. 在已知隐含状态数量、隐含状态之间的转移概率,根据可见状态链求此结果的概率;
  3. 仅知道隐含状态数量,根据可见状态链求隐含状态间的转换概率。

如果是求解“已知隐含状态的数量和隐含状态链,根据隐含状态链求此链的概率”是简单的,上方实例中十次概率相乘。

而如果解决问题一,参照https://www.cnblogs.com/skyme/p/4651331.html,我们可以解最大似然路径问题,即已知可见状态链的情况下求十次结果中每次最可能的隐含状态。最简单的就是穷举所有,然后求最大概率的序列。如过可见状态链太长了就很难完成这一任务了。有个知名的算法叫做Viterbi algorithm,即取各个可见状态链的每一个节点最可能的隐含状态。

Vitebi algorithm

HMM(隐马尔可夫模型)是用来描述隐含未知参数的统计模型,举一个经典的例子:一个东京的朋友每天根据天气{下雨,天晴}决定当天的活动{公园散步,购物,清理房间}中的一种,我每天只能在twitter上看到她发的推“啊,我前天公园散步、昨天购物、今天清理房间了!”,那么我可以根据她发的推特推断东京这三天的天气。在这个例子里,显状态是活动,隐状态是天气。

任何一个HMM都可以通过下列五元组来描述:

6cbb8645gw1egs40a3bpmj208n09574o

伪码如下:

states = ('Rainy', 'Sunny')
 
observations = ('walk', 'shop', 'clean')
 
start_probability = {'Rainy': 0.6, 'Sunny': 0.4}
 
transition_probability = {
    'Rainy' : {'Rainy': 0.7, 'Sunny': 0.3},
    'Sunny' : {'Rainy': 0.4, 'Sunny': 0.6},
    }
 
emission_probability = {
    'Rainy' : {'walk': 0.1, 'shop': 0.4, 'clean': 0.5},
    'Sunny' : {'walk': 0.6, 'shop': 0.3, 'clean': 0.1},
}

求解最可能的天气

求解最可能的隐状态序列是HMM的三个典型问题之一,通常用维特比算法解决。维特比算法就是求解HMM上的最短路径(-log(prob),也即是最大概率)的算法。

稍微用中文讲讲思路,很明显,第一天天晴还是下雨可以算出来:

  1. 定义V[时间][今天天气] = 概率,注意今天天气指的是,前几天的天气都确定下来了(概率最大)今天天气是X的概率,这里的概率就是一个累乘的概率了。

  2.     因为第一天我的朋友去散步了,所以第一天下雨的概率V[第一天][下雨] = 初始概率[下雨] * 发射概率[下雨][散步] = 0.6 * 0.1 = 0.06,同理可得V[第一天][天晴] = 0.24 。从直觉上来看,因为第一天朋友出门了,她一般喜欢在天晴的时候散步,所以第一天天晴的概率比较大,数字与直觉统一了。

  3. 从第二天开始,对于每种天气Y,都有前一天天气是X的概率 * X转移到Y的概率 * Y天气下朋友进行这天这种活动的概率。因为前一天天气X有两种可能,所以Y的概率有两个,选取其中较大一个作为V[第二天][天气Y]的概率,同时将今天的天气加入到结果序列中

  4. 比较V[最后一天][下雨]和[最后一天][天晴]的概率,找出较大的哪一个对应的序列,就是最终结果。

算法的代码可以在github上看到,地址为:

https://github.com/hankcs/Viterbi

运行完成后根据Viterbi得到结果:

Sunny Rainy Rainy

猜你喜欢

转载自blog.csdn.net/qq_37865996/article/details/84131193