@Macux
2018-03-15T13:47:24.000000Z
字数 7213
阅读 1996
Algorithm
- EM算法是一种迭代算法,用于含有隐变量(hidden variable)的概率模型参数的极大似然估计(Maximum Likelihood Estimation))。
- EM算法分为 E步(求期望)和 M步(求极大)。
- EM算法的基本思想是:
- 若参数已知,则可根据训练数据推断出最优隐变量的值(E步)
- 若隐变量已知,则可方便地对参数进行MLE;(M步)
- 说人话:EM算法首先固定其中的第一个参数,然后使用MLE计算第二个变量值。接着通过固定第二个变量,再使用MLE估测第一个变量值,依次迭代,直至收敛到局部最优解。
- EM算法的伟大之处:
突破了MLE的限制,即当存在hidden variable时,也可以一定能找到最优解(收敛性),大概率是局部最优。
假设有三枚硬币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),问如何估计三硬币的正面出现的概率?
首先针对某个输出值,它在参数下的概率分布为:
容易得到,对于观测数据的似然函数为:
这里有一个trick:
因此本题的目标是求解参数的极大似然估计,。
由于目标函数里有 hidden variable,无法用常规的 MLE 来求解,故这个问题需要用 EM 算法来求解。
- E步:当第 t+1 步,隐变量的条件概率分布,也就是每一个,表示在已知的模型参数下观测数据来自掷硬币B的概率,相应的来自掷C的概率就是。
- M步:根据Q函数的定义,可得其表达式为:
- 通过推导,可以得出Q函数最后的形式如下:(推导过程见夹在《统计学习方法》中的A4纸)
- 根据Q函数求解各个参数的解析解;(详见夹在《统计学习方法》中的A4纸)
- EM算法将不完全的数据补全成完全数据,其中E步是将未观测的数据的所有补全可能都计算出对应的概率值,从而对所有可能补全计算出它们的期望值,作为下一步的未观测数据。
- 上述中求期望值的原因:
既然是 hidden variable,而下一次的迭代又必须已知其值才能进行,故使用期望值更为合理。- Q函数想要表达的逻辑和思想:
- 在当前迭代中要找出一个新的,使得以新的为参数的某分布优于上一轮迭代的结果。
- 但因为存在 hidden variable,且又找不到更好的办法知道 hidden variable 的分布,故只能选用期望。
![]()
需要注意的点:
1. EM算法参数的初值可以任意选择,但EM算法对初值是敏感的;
2. 常用的解决方法是选取几个不同的初值进行迭代,然后对得到的各个估计值进行比较,从中选择最好的。
#!/usr/bin/env python
#coding:utf-8
"""
从工程上来看, 算法写的很一般。
但可以帮助自己理解如何用计算机实现一个复杂的机器学习算法。
代码非原创,来自github,地址如下:
https://github.com/jindc/em
"""
import sys
import math
class em():
def run(self,data,loopcnt=900000):
print data
pi=0.4
p=0.6
q=0.7
datanum=float(len(data))
def cpi(j):
tmp1 = pi*math.pow(p,data[j])*math.pow(1-p,1-data[j])
tmp2 = (1-pi)*math.pow(q,data[j])*math.pow(1-q,1-data[j])
return tmp1/(tmp1+tmp2)
for i in range(loopcnt):
pi = 1/datanum *\
sum([cpi(j)for j in range(int(datanum))])
p = sum([cpi(j)*data[j] for j in range(int(datanum))]) /(sum([cpi(j)for j in range(int(datanum))]))
q = sum([(1-cpi(j))*data[j] for j in range(int(datanum))] )/(sum([(1-cpi(j)) for j in range(int(datanum))]))
if str(pi)[0:6]=='0.4064'or str(pi)[0:6]=='0.4063':
if str(p)[0:6]=='0.5368' or str(p)[0:6]=='0.5367':
if str(q)[0:6]=='0.6432' or str(q)[0:6]=='0.6431':
break
# print i,pi ,p, q
self.pi =pi
self.p = p
self.q = q
if __name__=='__main__':
data=[1,1,0,1,0,0,1,0,1,1]
emi = em()
emi.run(data)
# print '---------'
print emi.pi,emi.p,emi.q
隐马尔可夫模型由三个概率确定:
- 初始概率分布(向量),即初始的隐含状态的概率分布,记为。
- 状态转移概率分布(矩阵),即隐含状态间的转移概率分布, 记为。
- 观测概率分布(矩阵),即由隐含状态生成观测状态的概率分布, 记为。
- 状态转移概率分布和初初始状态概率向量,确定了隐藏的马尔科夫链,生成不可观测的状态序列。
- 观测概率分布确定了如何从状态生成观测,与状态序列综合确定了如何产生观测序列。
- 和决定状态序列,决定观测序列。
- 以上的三个概率分布可以说就是隐马尔可夫模型的参数,而根据这三个概率,根据这三个概率,能够确定一个隐马尔可夫模型,
HMM的两个假设:
- 齐次马尔可夫性假设。任意时刻 t 的状态, 只依赖于其前一刻的状态, 与其他时刻的状态及观测无关, 也与时刻 t 无关。
- 观测独立性假设。时刻的观测结果只与时刻的状态结果有关,和其他无关。
- 概率计算问题。给定模型和观测序列 ,计算在模型下观测序列出现的最大概率。
- 学习问题。给定观测序列,估计模型的参数, 使得在该参数下观测序列出现的概率最大,即最大。【易见:问题1是问题2的基础】
- 预测问题。给定模型和观测序列 ,计算最有可能产生这个观测序列的隐含序列, 即使得概率 最大的隐含序列。
前向算法
- 前向概率:给定隐马尔可夫模型,定义为到时刻为止观测序列为 ,且状态为的概率,记为:
- 算法流程:
输入:隐马尔可夫模型,观测序列。
输出:观测序列概率
(1)初值:
(2)递推:对于,
(3)终止
- 算法理解:
- 为什么是累加求和?
- 因为可以产生观测的状态有很多种,所以求出它们的边缘概率才符合客观事实。
- 代表着某一种状态序列产生观测序列的概率,而状态取值有种,故应该求和。
- 一张图搞定递推式子的本质理解
后向算法
- 后向概率:给定隐马尔可夫模型,定义在时刻状态为的条件下,从到的部分观测序列为的概率,记为:
- 算法流程:
输入:隐马尔可夫模型,观测序列。
输出:观测序列概率
(1)初值:
(2)递推:对于
(3)终止
- 算法理解:
- 一张图搞定递推式子的本质理解
- 根据上述两幅图来写各自的递推公式会让逻辑更清晰,堪称 。
- 能够产生观测序列的状态有很多种,故一定是根据状态变量求累加(边缘概率)。
小结
- 利用前向概率和后向概率的定义,可以将观测序列概率统一写成:
- 公式理解:
- 点乘前面的部分,保证了时刻的状态为;
- 和保证了除时刻外剩余观测序列的正确性;
一些概率与期望值的计算
- 给定模型和观测,在时刻处于状态的概率:
- 给定模型和观测,在时刻处于状态且时刻处于状态的概率
- 将和对各个时刻求和,可以得到一些有用的期望值:
- 在观测下状态出现的期望值:
- 在观测下由状态转移的期望值:
- 在观测下由状态转移到状态的期望值:
- 学习问题是根据观测序列来推导模型参数,这一类的问题对应到概率论中的极大似估计问题。但是这里是有隐含变量的极大似然估计,因此无法使用 MLE 来求解,而要通过 EM 算法来求解。
- Baum-Welch 是 EM 算法在 HMM 求解学习问题的具体应用,具体的求解公式如下:
- 维特比(Viterbi Algorithm)是用动态规划(dynamtic programming)求解 HMM 的预测问题,即求概率最大路径(最优路径),这条路径对应着一个状态序列。
- 由于最优路径的子路径也是最优路径,故可以用迭代思想求解出最优路径。
- Viterbi Algo 的算法流程:
- 对 Viterbi Algo 的理解
- 它是基于迭代思想找到最优路径;
- 首先,控制着“个体”之间的“最优解”,即时刻最大的就是当前时刻最棒的“个体”;
- 然后,基于从后往前推,找出最优路径,即在考虑前一个时刻的情况()后,“最优个体”是否会发生变化。
- 总结起来就是,定最优终点,回溯出最优路径。