隐马尔科夫模型


马尔可夫链

在介绍隐马尔科夫模型之前,先简单说下马尔科夫模型和马尔科夫链。
马尔科夫模型是一种统计模型,广泛用于自然语言处理领域。马尔科夫是个苏联搞数学的,切比雪夫的弟子。
马尔可夫链是一种状态序列,其中每个状态值取决于前面的有限个状态。 Xn 的值是时间n的状态。如果 Xn+1 对于过去状态的条件概率分布仅是 Xn 的一个函数,则

P(Xn+1=x|X1=x1,X2=x2,...,Xn=xn)=P(Xn+1=x|Xn=xn)

隐马尔科夫模型HMM

Hidden Markov Model是描述含有未知参数的马尔科夫过程的模型。
举个栗子,来源于 skyme的博客
有如下图三个筛子,每个面标号如下图,每个骰子均匀,每个面出现等概。
隐马尔科夫模型_第1张图片
我们开始掷骰子。步骤一,任选一个骰子(1/3概率)。
步骤二,掷骰子得到一个数字。
重复两个步骤得到遗传数字(掷10次):1 6 3 5 2 7 3 5 2 4

这串数字叫做可见状态链。但是在隐马尔可夫模型中,我们不仅仅有这么一串可见状态链,还有一串隐含状态链。在这个例子里,这串隐含状态链就是你用的骰子的序列。比如,隐含状态链有可能是:D6 D8 D8 D6 D4 D8 D6 D6 D4 D8
隐马尔科夫模型_第2张图片

一般来说,HMM中说到的马尔可夫链其实是指隐含状态链,因为隐含状态(骰子)之间存在转换概率(transition probability)。在我们这个例子里,D6的下一个状态是D4,D6,D8的概率都是1/3。D4,D8的下一个状态是D4,D6,D8的转换概率也都一样是1/3。这样设定是为了最开始容易说清楚,但是我们其实是可以随意设定转换概率的。比如,我们可以这样定义,D6后面不能接D4,D6后面是D6的概率是0.9,是D8的概率是0.1。这样就是一个新的HMM。
隐马尔科夫模型_第3张图片

同样的,尽管可见状态之间没有转换概率,但是隐含状态和可见状态之间有一个概率叫做输出概率(emission probability)。就我们的例子来说,六面骰(D6)产生1的输出概率是1/6。产生2,3,4,5,6的概率也都是1/6。我们同样可以对输出概率进行其他定义。比如,我有一个被赌场动过手脚的六面骰子,掷出来是1的概率更大,是1/2,掷出来是2,3,4,5,6的概率是1/10。

Viterbi Alogorith 维特比算法

参考一路风尘的博客
维特比算法就是求解HMM上的最短路径(即最大概率)的算法。
还是举个栗子:
有个男生叫黑子,它课余时间会打篮球、桌球和打游戏,而漫画世界里天气只有晴天、多云和下雨三种,黑子在每种天气下进行每种课余活动的概率是一个3X3矩阵。
如果黑子三天的课余活动是:打篮球,打篮球,打游戏。我们就可以推算出可能性最大隐含序列,来预测这三天的天气情况。

穷举搜索

暴力的方法。我们穷举所有可能的隐含状态,概率最大的就是我们要的解。在这个简单例子里,这种策略当然是可行的,但当问题复杂的时候穷举的方式计算量太大,计算复杂度是 mn ,这无疑是太大了。

维特比算法(Viterbi Alogorith)

对于转移图中的每个状态,都存在一条达到这个状态的最佳路径。
隐马尔科夫模型_第4张图片
对于每个时间t的某个状态X的最佳路径,都可以在t-1状态的基础上得到。
隐马尔科夫模型_第5张图片
求解公式为:
公式
其中第一部分由t-1时刻的部分概率得到,第二部分是状态转移概率,第三部分是混淆矩阵(向隐含状态转换)中对应的概率。
数据结构:在仿真过程中可以用一个反向指针来记录状态的转移顺序。即记录当前状态的前一状态。

HMM和Viterbi Alogorith 在服务链功能部署中的应用

来自大神师兄论文的建模思想:

  • 对于一条特定的服务链请求,服务链中每个虚拟网络功能单元的顺序是确定的,也就是说有已知的上下文关系。这就是一条看见状态链(相当于掷骰子掷出的结果)。
  • 根据资源约束,我们可以确定每个虚拟网络功能(VNF)可以部署在哪些节点上,这些节点集就是隐含状态的集合(相当于对于某一种特定的掷骰子结果,可能的骰子有几种)。
  • 在掷骰子的例子中我们可以计算转换概率,在服务链功能部署问题中,我们可以把时延作为优化目标。
  • 用Viterbi算法求时延最小的一条最优路径问题(相当于求解就有可能的骰子序列)。最后得出的隐含链的顺序就对应于虚拟功能链部署的方案。

    大体思路如上,当然具体细节还需要做修正。

More

  • 如果从可靠性角度考虑服务功能链的备份问题,需要为服务链寻找备份链路时,可以使用次优路径作为备份路径。
  • 寻找次优的路径,即要生成N-best个候选解。崔晓源博客中提到,viterbi算法就只能生成一条最好的路径,产生N-best候选的时候该怎么办呢?其实实际应用过程中,通常是把Viterbi Decoding与另一种称为Stack Decoding的算法联合使用(当然A*算法也可以)产生多个候选。这个可以考虑进一步学习和思考。

你可能感兴趣的:(马尔科夫模型)