简单易学的机器学习算法——EM算法

一、机器学习中的参数估计问题

在前面的博文中,如“简单易学的机器学习算法——Logistic回归”中,采用了极大似然函数对其模型中的参数进行估计,简单来讲即对于一系列样本,Logistic回归问题属于监督型学习问题,样本中含有训练的特征以及标签,在Logistic回归的参数求解中,通过构造样本属于类别和类别的概率:

这样便能得到Logistic回归的属于不同类别的概率函数:

此时,使用极大似然估计便能够估计出模型中的参数。但是,如果此时的标签是未知的,称为隐变量,如无监督的学习问题,典型的如K-Means聚类算法,此时不能直接通过极大似然估计估计出模型中的参数。

二、EM算法简介

在上述存在隐变量的问题中,不能直接通过极大似然估计求出模型中的参数,EM算法是一种解决存在隐含变量优化问题的有效方法。EM算法是期望极大(Expectation Maximization)算法的简称,EM算法是一种迭代型的算法,在每一次的迭代过程中,主要分为两步:即求期望(Expectation)步骤和最大化(Maximization)步骤。

三、EM算法推导的准备

1、凸函数

是定义在实数域上的函数,如果对于任意的实数,都有

那么是凸函数。若不是单个实数,而是由实数组成的向量,此时,如果函数的Hesse矩阵是半正定的,即

那么是凸函数。特别地,如果或者,那么称为严格凸函数。

2、Jensen不等式

如果函数是凸函数,是随机变量,那么

特别地,如果函数是严格凸函数,那么当且仅当

即随机变量是常量。

(图片来自参考文章1)

注:若函数是凹函数,上述的符号相反。

3、数学期望

3.1随机变量的期望

设离散型随机变量的概率分布为:

其中,,如果绝对收敛,则称的数学期望,记为,即:

若连续型随机变量的概率密度函数为,则数学期望为:

3.2随机变量函数的数学期望

是随机变量的函数,即,若是离散型随机变量,概率分布为:

则:

是连续型随机变量,概率密度函数为,则

四、EM算法的求解过程

    假设表示观测变量,表示潜变量,则此时即为完全数据,的似然函数为,其中,为需要估计的参数,那么对于完全数据,的似然函数为
    构建好似然函数,对于给定的观测数据,为了估计参数,我们可以使用极大似然估计的方法对其进行估计。因为变量是未知的,我们只能对的似然函数为进行极大似然估计,即需要极大化:
上述式子中无法直接对求极大值,因为在函数中存在隐变量,即未知变量。若此时,我们能够确定隐变量的值,便能够求出的极大值,可以用过不断的修改隐变量的值,得到新的的极大值。这便是EM算法的思路。通过迭代的方式求出参数
    首先我们需要对参数赋初值,进行迭代运算,假设第次迭代后参数的值为,此时的log似然函数为,即:
在上式中,第二行到第三行使用到了Jensen不等式,由于log函数是凹函数,由Jensen不等式得到:
 
 
表示的是的期望,其中,表示的是隐变量满足的某种分布。这样,上式的值取决于的概率。在迭代的过程中,调整这两个概率,使得下界不断的上升,这样就能求得的极大值。注意,当等式成立时,说明此时已经等价于。由Jensen不等式可知,等式成立的条件是随机变量是常数,即:
已知:
所以:
则:
至此,我们得出了隐变量满足的分布的形式。这就是EM算法中的E步。在确定了后,调整参数使得取得极大,这便是M步。EM算法的步骤为:
  1. 初始化参数,开始迭代;
  2. E步:假设为第次迭代参数的估计值,则在第次迭代中,计算
  3. M步:求使极大化的,确定第次的参数的估计值

五、EM算法的收敛性保证

迭代的过程能否保证最后找到的就是最大的似然函数值呢?即需要证明在整个迭代的过程中,极大似然估计是单调增加的。假定是EM算法的第次和第次迭代后的结果,选定,进行迭代:
  1. E步:
  2. M步:

固定,将看成变量:

上式中,第一个大于等于是因为:

六、利用EM算法参数求解实例

假设有有一批数据分别是由两个正态分布:

产生,其中,未知,。但是不知道具体的是第产生,即可以使用表示。这是一个典型的涉及到隐藏变量的例子,隐藏变量为。可以使用EM算法对参数进行估计。

  1. 首先是初始化
  2. E步:,即求数据是由第个分布产生的概率:
  3. M步:,即计算最大的期望值。然而我们要求的参数是均值,可以通过如下的方式估计:

Python代码

  1. #coding:UTF-8
  2. '''''
  3. Created on 2015年6月7日
  4. @author: zhaozhiyong
  5. '''
  6. from __future__ import division
  7. from numpy import *
  8. import math as mt
  9. #首先生成一些用于测试的样本
  10. #指定两个高斯分布的参数,这两个高斯分布的方差相同
  11. sigma = 6
  12. miu_1 = 40
  13. miu_2 = 20
  14. #随机均匀选择两个高斯分布,用于生成样本值
  15. N = 1000
  16. X = zeros((1, N))
  17. for i in xrange(N):
  18. if random.random() > 0.5:#使用的是numpy模块中的random
  19. X[0, i] = random.randn() * sigma + miu_1
  20. else:
  21. X[0, i] = random.randn() * sigma + miu_2
  22. #上述步骤已经生成样本
  23. #对生成的样本,使用EM算法计算其均值miu
  24. #取miu的初始值
  25. k = 2
  26. miu = random.random((1, k))
  27. #miu = mat([40.0, 20.0])
  28. Expectations = zeros((N, k))
  29. for step in xrange(1000):#设置迭代次数
  30. #步骤1,计算期望
  31. for i in xrange(N):
  32. #计算分母
  33. denominator = 0
  34. for j in xrange(k):
  35. denominator = denominator + mt.exp(-1 / (2 * sigma ** 2) * (X[0, i] - miu[0, j]) ** 2)
  36. #计算分子
  37. for j in xrange(k):
  38. numerator = mt.exp(-1 / (2 * sigma ** 2) * (X[0, i] - miu[0, j]) ** 2)
  39. Expectations[i, j] = numerator / denominator
  40. #步骤2,求期望的最大
  41. #oldMiu = miu
  42. oldMiu = zeros((1, k))
  43. for j in xrange(k):
  44. oldMiu[0, j] = miu[0, j]
  45. numerator = 0
  46. denominator = 0
  47. for i in xrange(N):
  48. numerator = numerator + Expectations[i, j] * X[0, i]
  49. denominator = denominator + Expectations[i, j]
  50. miu[0, j] = numerator / denominator
  51. #判断是否满足要求
  52. epsilon = 0.0001
  53. if sum(abs(miu - oldMiu)) < epsilon:
  54. break
  55. print step
  56. print miu
  57. print miu

最终结果

[[ 40.49487592  19.96497512]]

参考文章:

1、(EM算法)The EM Algorithm (http://www.cnblogs.com/jerrylead/archive/2011/04/06/2006936.html)

2、数学期望(http://wenku.baidu.com/view/915a9c1ec5da50e2524d7f08.html?re=view)

简单易学的机器学习算法——EM算法的更多相关文章

  1. 简单易学的机器学习算法—SVD奇异值分解

    简单易学的机器学习算法-SVD奇异值分解 一.SVD奇异值分解的定义     假设M是一个的矩阵,如果存在一个分解: 其中的酉矩阵,的半正定对角矩阵,的共轭转置矩阵,且为的酉矩阵.这样的分解称为M的奇 ...

  2. 简单易学的机器学习算法—基于密度的聚类算法DBSCAN

    简单易学的机器学习算法-基于密度的聚类算法DBSCAN 一.基于密度的聚类算法的概述 我想了解下基于密度的聚类算法,熟悉下基于密度的聚类算法与基于距离的聚类算法,如K-Means算法之间的区别.    ...

  3. 斯坦福大学机器学习,EM算法求解高斯混合模型

    斯坦福大学机器学习,EM算法求解高斯混合模型.一种高斯混合模型算法的改进方法---将聚类算法与传统高斯混合模型结合起来的建模方法, 并同时提出的运用距离加权的矢量量化方法获取初始值,并采用衡量相似度的 ...

  4. 机器学习五 EM 算法

    目录 引言 经典示例 EM算法 GMM 推导 参考文献: 引言 Expectation maximization (EM) 算法是一种非常神奇而强大的算法. EM算法于 1977年 由Dempster ...

  5. 关于机器学习-EM算法新解

    我希望自己能通俗地把它理解或者说明白,但是,EM这个问题感觉真的不太好用通俗的语言去说明白,因为它很简单,又很复杂.简单在于它的思想,简单在于其仅包含了两个步骤就能完成强大的功能,复杂在于它的数学推理 ...

  6. 机器学习之EM算法(五)

    摘要 EM算法全称为Expectation Maximization Algorithm,既最大期望算法.它是一种迭代的算法,用于含有隐变量的概率参数模型的最大似然估计和极大后验概率估计.EM算法经常 ...

  7. 【机器学习】EM算法详细推导和讲解

    今天不太想学习,炒个冷饭,讲讲机器学习十大算法里有名的EM算法,文章里面有些个人理解,如有错漏,还请读者不吝赐教. 众所周知,极大似然估计是一种应用很广泛的参数估计方法.例如我手头有一些东北人的身高的 ...

  8. 详解十大经典机器学习算法——EM算法

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第14篇文章,我们来聊聊大名鼎鼎的EM算法. EM算法的英文全称是Expectation-maximization al ...

  9. 【机器学习】--EM算法从初识到应用

    一.前述 Em算法是解决数学公式的一个算法,是一种无监督的学习. EM算法是一种解决存在隐含变量优化问题的有效方法.EM算法是期望极大(Expectation Maximization)算法的简称,E ...

随机推荐

  1. HDU 1242 rescue and 优先级队列的条目

    Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is ...

  2. java final keyword

    依据上下文环境,java的keywordfinal也存在着细微的差别,但通常指的是“这是无法改变的.”不想改变的理由由两种:一种是效率,还有一种是设计.因为两个原因相差非常远,所以关键子final可能 ...

  3. ATL 工程下添加右击菜单

    首先在dllmain.cpp中添加如下声明 HINSTANCE g_hInstance;  g_hInstance = hInstance; 源码如下: CPoint point;  ::GetCur ...

  4. 装有Win7系统的电脑在局域网不能共享的解决方案

    Win7系统的网络功能比XP有了进一步的增强,使用起来也相对清晰.但是由于做了很多表面优化的工作,使得底层的网络设置对于习惯了XP系统的人来说变得很不适应,其中局域网组建就是一个很大的问题.默认安装系 ...

  5. 手动创建Servlet--J2EE学习笔记

    Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层. 使用 Serv ...

  6. JDK7 HashMap源码分析

    本文基于JDK1.7.0_79的版本进行分析. 注释比较详细. 若有不明白的地方可以指出, 我再进行细化. public class HashMap<K,V> extends Abstra ...

  7. Linux查看当前系统登录用户、登录日志、登录错误日志

    1.查看当前系统的登录用户 w who 2.查看成功登录历史记录 last -n 3.查看尝试登录失败的历史记录 lastb -n 4.显示每个用户最近一次登录成功的信息 lastlog

  8. python 面向对象深入理解

    面向过程 函数式编程 面向对象编程:面向对象是由类和对象组成,只要用类和对象实现的,就是面向对象编程 def  Bar():     print  "This is  Bar " ...

  9. ArcGIS 在地图上添加标注

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. day-9

    /* 考前第9天 区间*的线段树居然卡住了23333 明天再搞搞 今天针对考试复习了几个板子 手动堆都打了 实测比priority快 下午考试成了炮灰233333 晚上复习矩阵乘法 手推9*9矩阵 可 ...