小白给小白详解维特比算法(二)——隐马尔科夫模型(HMM)
本文致力于解释隐含马尔科夫模型和上一篇我们提到的篱笆网络的最短路径问题的相同点和不同点,尽量通俗易懂但是也有些必要的公式。如果你有数学恐惧症,请无视所有的“注”。我的概率论学的很烂,如果“注”里面有错误,请务必直接喷,不要留情,谢谢!
隐马尔科夫模型(HMM)和篱笆网络(神马关系)
咱先别"隐身",先说说啥是马尔科夫模型?
隐马尔科夫模型,一听这个名字就和马尔科夫模型有着隐藏的联系。
所谓的马尔科夫模型,其实说的就是好好一个人,是怎么变来变去的(旁白:???)。比如说,一个人某一天可能轻微感冒,也可能正常,还可能重感冒(请原谅我对病不是很了解)。如果你认为这个是上天随机抛硬币决定的倒也可以,比如我们可以认为:
P(身体状态=正常)=0.7
P(身体状态=轻感冒)=0.2
P(身体状态=重感冒)=0.1
但是可能更多的,某一天的身体状态是由这个人长期以来作出来的……啊不是,是和前一天(或者N天)的身体状态变来的。比如正常可能会更大概率让第二天依然正常,而轻感冒比正常更容易让第二天表现为重感冒。
如果我们认为某一天的身体状态完全由前一天的身体状态来决定(这叫做一阶马尔科夫假设,这算是这个世界上最不负责任的10000个假设之一了,好在很多情况下这种假设还蛮好用),那么我们可以画这样一个图出来:
图1
简单解释一下,如果某个人在昨天是轻感冒,那么在今天他有0.4的概率维持轻感冒的状态,0.4的概率病情好转,还有0.2的概率病情恶化。
Emmmm…看上去有点乱,如果只有这么三个状态还好,如果状态再多点,感觉就要眼花缭乱了!
所以通常来说,我们使用类似下面的表格来描述整个马尔科夫过程的。
图2
这样是不是清楚多了!那么如果我们省去不必要的字,仅仅用一个矩阵来表示的话,可以这样来写(称为状态转移矩阵
):
{ 0.7 0.2 0.1 0.4 0.4 0.2 0.2 0.5 0.3 } \left\{ \begin{matrix} 0.7 & 0.2 & 0.1 \\ 0.4 & 0.4 & 0.2 \\ 0.2 & 0.5 & 0.3 \end{matrix} \right\} ⎩⎨⎧0.70.40.20.20.40.50.10.20.3⎭⎬⎫
当然了,既然有一阶马尔科夫假设,当然就有二阶、三阶乃至N阶,他们都是假设今天(t时刻)的状态仅仅和前n天(t-1,t-2…t-n时刻)的状态来决定。比如如果基于二阶马尔科夫假设,某个人前天和昨天分别是重感冒、轻感冒,那么今天说不定感冒也就快好了(美好的祝愿),而今天的状态仅仅和昨天前天有关,和再往前的历史已经没什么关系了。
马尔科夫模型和篱笆网络
那么这个时候我们就可以把上一篇文章的篱笆网络弄过来了。
图3
咱们把这幅图简单改一下,把A和E去掉(当然可以留下A,这个时候是所谓的”先验”,我们先不考虑这个),然后把节点的权重修改一下,就得到了“治病救人篱笆网络”:
图4
“我能在河边,画上一整天的图!”纳特·帕格兴高采烈地说道。
我们很容易发现,只要把原本的节点间的距离,换成状态转移矩阵中的转移概率,我们就轻松地把“跑腿不累篱笆网络”改成了“治病救人篱笆网络”。
那你看这个时候你的老师就很容易考你了,“已知一个人2月1号重感冒,2月5号正常,告诉我他经历了哪条状态序列的概率最大!”(旁白:鬼知道他经历了什么,大概是吃了感冒药吧!)你会发现这个问题和上一篇文章的“跑腿不累篱笆网络”几乎没什么区别,如果硬要说有区别的话,既然每一天转移都是独立的,那么概率需要乘在一起(见下注),最后看谁最大,而不是“跑腿”中的简单做加法。
图5
比如他经历了“重感冒、正常、轻感冒、重感冒、轻感冒、正常”(旁白:这个人也是体弱多病!)的概率是 P = 0.2 × 0.2 × 0.2 × 0.5 × 0.4 = 0.0016 P = 0.2\times 0.2 \times 0.2 \times 0.5 \times 0.4=0.0016 P=0.2×0.2×0.2×0.5×0.4=0.0016。我们可以算出所有路径的概率得到最大的那个,但是我们上一篇已经学会了维特比算法,你应该学会减少了很多路径。
注:为什么我们简单把路径上的概率乘在一起就可以呢?(一阶)马尔科夫假设事实上是这样一个东西(竖线|表示“给定,以…为条件”):(来自维基百科),即在已经出现了前N个状态的条件下得到第N+1个状态的概率等于已经出现了第N个状态时出现第N+1个概率(所以才说“和前天无关只和昨天有关”)。而根据条件概率,我们有 P ( X n + 1 = 轻 感 冒 , X n = 重 感 冒 ) = P ( X n + 1 = 轻 感 冒 ∣ X n = 重 感 冒 ) P ( X n = 重 感 冒 ) (0) P(X_{n+1}=轻感冒,X_{n}=重感冒)=P(X_{n+1}=轻感冒|X_n=重感冒)P(X_n=重感冒)\tag{0} P(Xn+1=轻感冒,Xn=重感冒)=P(Xn+1=轻感冒∣Xn=重感冒)P(Xn=重感冒)(0)即这个人昨天重感冒今天轻感冒的概率(联合概率)=在昨天重感冒的情况下今天轻感冒的概率(转移概率) × \times ×这个人昨天重感冒的概率。所以如果我们已知昨天这个人重感冒,那么 P ( X n = 重 感 冒 ) = 1 P(X_n=重感冒)=1 P(Xn=重感冒)=1,这个联合概率和转移概率就相等了。
那么如果转移两天呢?比如我们已知一个人第n天重感冒,求第n+1天第n+2天分别是轻感冒、正常的概率呢?我们尝试着把公式写出来:
KaTeX parse error: \tag works only in display equations
P ( X n + 2 = 重 感 冒 ∣ X n + 1 = 轻 感 冒 , X n = 重 感 冒 ) × P ( X n + 1 = 轻 感 冒 , X n = 重 感 冒 ) P(X_{n+2}=重感冒|X_{n+1}=轻感冒,X_n=重感冒)\times P(X_{n+1}=轻感冒,X_n=重感冒) P(Xn+2=重感冒∣Xn+1=轻感冒,Xn=重感冒)×P(Xn+1=轻感冒,Xn=重感冒)
也就是说,这三天出现“重感冒、轻感冒、正常”的概率,等于在已知前两天分别是“重感冒、轻感冒”而最后一天“正常”的概率,乘以前两天分别“重感冒、轻感冒”的概率。而根据一阶马尔科夫假设,我们知道最后一天“正常”和第一天是什么状态并没有什么关系,仅仅和第二天的状态有关,也就意味着我们发现等式右边的第一项其实与第二天到第三天的转移概率相等: