[关闭]
@Macux 2018-03-15T13:47:24.000000Z 字数 7213 阅读 1996

EM & HMM

Algorithm



1、EM(Expectation Maximization)

1.1 EM算法简介

  • EM算法是一种迭代算法,用于含有隐变量(hidden variable)的概率模型参数的极大似然估计(Maximum Likelihood Estimation))。
  • EM算法分为 E步(求期望)M步(求极大)
  • EM算法的基本思想是:
    1. 若参数已知,则可根据训练数据推断出最优隐变量的值(E步)
    2. 若隐变量已知,则可方便地对参数进行MLE;(M步)
    3. 说人话:EM算法首先固定其中的第一个参数,然后使用MLE计算第二个变量值。接着通过固定第二个变量,再使用MLE估测第一个变量值,依次迭代,直至收敛到局部最优解。
  • EM算法的伟大之处:
    突破了MLE的限制,即当存在hidden variable时,也可以一定能找到最优解(收敛性),大概率是局部最优。

1.2 EM 算法的理论推导

1.2.1 三硬币模型

假设有三枚硬币A、B、C,每个硬币正面出现的概率。进行如下的掷硬币实验:先掷硬币A,正面向上选B,反面选C;然后掷选择的硬币,正面记1,反面记0。独立的进行10次实验,结果如下:1,1,0,1,0,0,1,0,1,1。假设只能观察最终的结果(0 or 1),而不能观测掷硬币的过程(不知道选的是B or C),问如何估计三硬币的正面出现的概率?



1.2.2 EM算法的基本步骤

此处输入图片的描述
需要注意的点:
1. EM算法参数的初值可以任意选择,但EM算法对初值是敏感的;
2. 常用的解决方法是选取几个不同的初值进行迭代,然后对得到的各个估计值进行比较,从中选择最好的。

1.2.3 EM算法一般性推导


1.3 EM 算法的 Python 实现

  1. #!/usr/bin/env python
  2. #coding:utf-8
  3. """
  4. 从工程上来看, 算法写的很一般。
  5. 但可以帮助自己理解如何用计算机实现一个复杂的机器学习算法。
  6. 代码非原创,来自github,地址如下:
  7. https://github.com/jindc/em
  8. """
  9. import sys
  10. import math
  11. class em():
  12. def run(self,data,loopcnt=900000):
  13. print data
  14. pi=0.4
  15. p=0.6
  16. q=0.7
  17. datanum=float(len(data))
  18. def cpi(j):
  19. tmp1 = pi*math.pow(p,data[j])*math.pow(1-p,1-data[j])
  20. tmp2 = (1-pi)*math.pow(q,data[j])*math.pow(1-q,1-data[j])
  21. return tmp1/(tmp1+tmp2)
  22. for i in range(loopcnt):
  23. pi = 1/datanum *\
  24. sum([cpi(j)for j in range(int(datanum))])
  25. p = sum([cpi(j)*data[j] for j in range(int(datanum))]) /(sum([cpi(j)for j in range(int(datanum))]))
  26. q = sum([(1-cpi(j))*data[j] for j in range(int(datanum))] )/(sum([(1-cpi(j)) for j in range(int(datanum))]))
  27. if str(pi)[0:6]=='0.4064'or str(pi)[0:6]=='0.4063':
  28. if str(p)[0:6]=='0.5368' or str(p)[0:6]=='0.5367':
  29. if str(q)[0:6]=='0.6432' or str(q)[0:6]=='0.6431':
  30. break
  31. # print i,pi ,p, q
  32. self.pi =pi
  33. self.p = p
  34. self.q = q
  35. if __name__=='__main__':
  36. data=[1,1,0,1,0,0,1,0,1,1]
  37. emi = em()
  38. emi.run(data)
  39. # print '---------'
  40. print emi.pi,emi.p,emi.q

2、HMM(Hidden Marcov Model)

2.1 HMM 的基本概念


2.2 HMM的三个基本问题

  1. 概率计算问题。给定模型和观测序列 ,计算在模型下观测序列出现的最大概率
  2. 学习问题。给定观测序列,估计模型的参数, 使得在该参数下观测序列出现的概率最大,即最大。【易见:问题1是问题2的基础】
  3. 预测问题。给定模型和观测序列 ,计算最有可能产生这个观测序列的隐含序列, 即使得概率 最大的隐含序列

2.3 概率计算问题


2.4 学习问题

  1. 学习问题是根据观测序列来推导模型参数,这一类的问题对应到概率论中的极大似估计问题。但是这里是有隐含变量的极大似然估计,因此无法使用 MLE 来求解,而要通过 EM 算法来求解。
  2. Baum-Welch 是 EM 算法在 HMM 求解学习问题的具体应用,具体的求解公式如下:



2.5 预测问题

  1. 维特比(Viterbi Algorithm)是用动态规划(dynamtic programming)求解 HMM 的预测问题,即求概率最大路径(最优路径),这条路径对应着一个状态序列。
  2. 由于最优路径的子路径也是最优路径,故可以用迭代思想求解出最优路径。
  3. Viterbi Algo 的算法流程:
    此处输入图片的描述
  4. 对 Viterbi Algo 的理解
    • 它是基于迭代思想找到最优路径;
    • 首先,控制着“个体”之间的“最优解”,即时刻最大的就是当前时刻最棒的“个体”;
    • 然后,基于从后往前推,找出最优路径,即在考虑前一个时刻的情况()后,“最优个体”是否会发生变化。
    • 总结起来就是,最优终点回溯出最优路径

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注