在前面的博文中,如“简单易学的机器学习算法——Logistic回归”中,采用了极大似然函数对其模型中的参数进行估计,简单来讲即对于一系列样本,Logistic回归问题属于监督型学习问题,样本中含有训练的特征以及标签,在Logistic回归的参数求解中,通过构造样本属于类别和类别的概率:
这样便能得到Logistic回归的属于不同类别的概率函数:
此时,使用极大似然估计便能够估计出模型中的参数。但是,如果此时的标签是未知的,称为隐变量,如无监督的学习问题,典型的如K-Means聚类算法,此时不能直接通过极大似然估计估计出模型中的参数。
在上述存在隐变量的问题中,不能直接通过极大似然估计求出模型中的参数,EM算法是一种解决存在隐含变量优化问题的有效方法。EM算法是期望极大(Expectation Maximization)算法的简称,EM算法是一种迭代型的算法,在每一次的迭代过程中,主要分为两步:即求期望(Expectation)步骤和最大化(Maximization)步骤。
设是定义在实数域上的函数,如果对于任意的实数,都有
那么是凸函数。若不是单个实数,而是由实数组成的向量,此时,如果函数的Hesse矩阵是半正定的,即
那么是凸函数。特别地,如果或者,那么称为严格凸函数。
如果函数是凸函数,是随机变量,那么
特别地,如果函数是严格凸函数,那么当且仅当
即随机变量是常量。
(图片来自参考文章1)
注:若函数是凹函数,上述的符号相反。
设离散型随机变量的概率分布为:
其中,,如果绝对收敛,则称为的数学期望,记为,即:
若连续型随机变量的概率密度函数为,则数学期望为:
设是随机变量的函数,即,若是离散型随机变量,概率分布为:
则:
若是连续型随机变量,概率密度函数为,则
假设有有一批数据分别是由两个正态分布:
产生,其中,和未知,。但是不知道具体的是第产生,即可以使用和表示。这是一个典型的涉及到隐藏变量的例子,隐藏变量为和。可以使用EM算法对参数进行估计。
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)
原文地址:http://blog.csdn.net/google19890102/article/details/46431715