码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-01-11 20:08:15      阅读:398      评论:0      收藏:0      [点我收藏+]

标签:

一、机器学习中的參数预计问题

    在前面的博文中,如“简单易学的机器学习算法——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代码

#coding:UTF-8
'''
Created on 2015年6月7日

@author: zhaozhiyong
'''
from __future__ import division
from numpy import *
import math as mt
#首先生成一些用于測试的样本
#指定两个高斯分布的參数,这两个高斯分布的方差同样
sigma = 6
miu_1 = 40
miu_2 = 20

#随机均匀选择两个高斯分布,用于生成样本值
N = 1000
X = zeros((1, N))
for i in xrange(N):
    if random.random() > 0.5:#使用的是numpy模块中的random
        X[0, i] = random.randn() * sigma + miu_1
    else:
        X[0, i] = random.randn() * sigma + miu_2

#上述步骤已经生成样本
#对生成的样本,使用EM算法计算其均值miu

#取miu的初始值
k = 2
miu = random.random((1, k))
#miu = mat([40.0, 20.0])
Expectations = zeros((N, k))

for step in xrange(1000):#设置迭代次数
    #步骤1。计算期望
    for i in xrange(N):
        #计算分母
        denominator = 0
        for j in xrange(k):
            denominator = denominator + mt.exp(-1 / (2 * sigma ** 2) * (X[0, i] - miu[0, j]) ** 2)
        
        #计算分子
        for j in xrange(k):
            numerator = mt.exp(-1 / (2 * sigma ** 2) * (X[0, i] - miu[0, j]) ** 2)
            Expectations[i, j] = numerator / denominator
    
    #步骤2。求期望的最大
    #oldMiu = miu
    oldMiu = zeros((1, k))
    for j in xrange(k):
        oldMiu[0, j] = miu[0, j]
        numerator = 0
        denominator = 0
        for i in xrange(N):
            numerator = numerator + Expectations[i, j] * X[0, i]
            denominator = denominator + Expectations[i, j]
        miu[0, j] = numerator / denominator
        
    
    #推断是否满足要求
    epsilon = 0.0001
    if sum(abs(miu - oldMiu)) < epsilon:
        break
    
    print step
    print miu
    
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算法

标签:

原文地址:http://www.cnblogs.com/lcchuguo/p/5122027.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!