作为机器学习的十大算法之一,EM算法可谓是风头出尽,尤其是EM算法在聚类等方面的优越表现,让EM算法备受瞩目,这个星期对EM算法进行了一番了解,说实话EM算法光从教科书上的那些公式说导我觉得很难理解,在七月算法的一节关于EM算法的公开课上慢慢的对EM算法有了算是入门的了解,今天就来说说EM算法与其典型的应用:高斯混合分布
首先简略介绍一个高斯混合分布:
在一个随机分布里面,可能存在着很多的分布类型,我们假设每个类的分布都符合高斯混合模型,那么一个随机值集合里面就会有多个高斯分布,举个简单的例子,在一群男女生中,我们统计每个人的身高数据,因为男女生的身高存在差异,我们显然不能讲两者的身高都做一样的处理,那么对于这个身高数据而言,男生的身高符合一个高斯分布,女生的身高符合一个高斯分布,这就是一个数据集里面的两个高斯分布,高斯分布的数学描述是:
其中phi表示一个高斯分布,alpha表示该高斯分布占的比例
回到男女身高问题本身,现在的问题是如何求解男女身高的均值和方差(标准差)
当然我们可以使用极大似然估计来求解,但这只是理论上可行,实际并不可行
因此我们需要使用一种新的办法来求解,当然,这里自然指的是:EM算法
EM算法该如何理解,这是一个问题,七月算法的公开课讲的非常给力,这里给出链接地址 http://www.julyedu.com/video/play/?id=79&course=18
这里我不准备对EM进行理论推导,对于上述的男女身高问题这里仅给出一个结论,然后我们使用python将这个问题解决,当然,具体的推导过程见附件的pdf文件
每次迭代过程的公式是:
最后我们使用python代码来实现以下男女身高问题的求解过程,我给出了一个男生占50人女生占70人的数据集,其中男生均值为175,标准差为2,女生均值是160,方标准差为2,并加以0~1的随机噪声,然后通过代码求解EM算法运算的准确性
# -*- coding: cp936 -*- """ EM算法与混合高斯分布 author:luchi date:2015/12/6 description:假如有一堆人,包括男的和女的,现在不知道 其比例只能统计身高信息,现在要求男的和女的的身高的均值 方差已经在人群中占得比例,使用EM算法的混合高斯模型可以 解决 """ from numpy import * from random import * import math #计算高斯值 def calcGauss(x,mu,sigma): return exp(-1*(x-mu)**2/2/(sigma**2))/sigma/sqrt(2*math.pi) #计算均值 def averageHeight(height,gamma,n): sumHeight=0.0 for i in range(len(height)): sumHeight+=height[i]*gamma[i] return float(sumHeight)/n #计算标准差 def varianceHeight(height,gamma,mu,n): sumVariance=0.0 for i in range(len(height)): sumVariance+=gamma[i]*(height[i]-mu)**2 return sqrt(float(sumVariance)/n) #终止条件gp,bp,gmu,gsigma,bmu,bsigma def isEqual(cur,now): cur=mat(cur).T now=mat(now).T temp=cur-now if temp.T*temp<0.001: return True return False #计算的主要函数,height为人群的身高分布 def calcEM(height): N=len(height) gp=0.5 #女孩的初始比例 bp=0.5 #男孩的初始比例 gmu,gsigma=min(height),1 #初始值的女孩身高均值和标准差 bmu,bsigma=max(height),1 #初始值的男孩身高均值和标准差 ggamma=range(N) #计算女孩在迭代过程中的gamma值 bgamma=range(N) #计算女孩在迭代过程中的gamma值 cur=[gp,bp,gmu,gsigma,bmu,bsigma] #初始的方差矩阵 now=[] times=0 #迭代次数 while times<100: i=0 for x in height: ggamma[i]= gp*calcGauss(x,gmu,gsigma) bgamma[i]= bp*calcGauss(x,bmu,bsigma) s= ggamma[i]+bgamma[i] ggamma[i]/=s bgamma[i]/=s i+=1 gn=sum(ggamma) #计算比例 gp=float(gn)/float(N) bn=sum(bgamma) bp=float(bn)/float(N) gmu=averageHeight(height,ggamma,gn) gsigma=varianceHeight(height,ggamma,gmu,gn) bmu=averageHeight(height,bgamma,bn) bsigma=varianceHeight(height,bgamma,bmu,bn) now=[gp,bp,gmu,gsigma,bmu,bsigma] if isEqual(cur,now): break cur=now print "迭代次数是:\t",times print "女孩的身高平均值和标准差是:\t",gmu,gsigma print "男孩的身高平均值和标准差是:\t",bmu,bsigma print "男孩女孩的比例是:\t",bn,gn,bn+gn times+=1 return now def test(): #产生随机测试集 height=[] #产生男生的身高数据 for i in range(50): height.append(gauss(175,2)+5*random()*pow(-1,i)) for i in range(70): height.append(gauss(160,2)+5*random()*pow(-1,i)) calcEM(height) if __name__=='__main__': test()
计算结果如下:
迭代次数是: 2 女孩的身高平均值和标准差是: 160.368555386 3.56047601722 男孩的身高平均值和标准差是: 174.782518706 3.52040845881 男孩女孩的比例是: 52.5771905209 67.4228094791 120.0
需要说明的是,EM算法对初值很敏感,而且EM算法是局部最优解,而不是全局最优解,但是在选定的初值偏差不是太大的情况下,EM算法还是有很好的准确度
相关推荐
对两个一维高斯分布产生的无先验知识样本进行分类最终得到样本属于哪个高斯分布的概率和各分布的均值方差
用em算法估计高斯混合模型的参数,实现对N维数据的聚类
EM算法混合高斯模型应用的matalb代码,代码有详细注释。
EM算法用于高斯混合模型,EM算法用于高斯混合模型,EM算法用于高斯混合模型
一个利用em算法,求解高斯混合模型的聚类源程序!
1.领域:matlab,EM算法估计高斯混合模型参数算法 2.内容:通过EM算法估计高斯混合模型参数的MATLAB仿真+代码操作视频 3.用处:用于EM算法估计高斯混合模型参数算法编程学习 4.指向人群:本硕博等教研学习使用 ...
基于python的高斯混合模型(GMM 聚类)的 EM 算法实现
高斯混合模型GMM与EM算法的matlab实现,用户可直接运行代码,观看结果,欢迎下载,进行进一步讨论
java编写的EM求解高斯混合分布的代码,有运行截图
高斯混合模型EM算法,通过EM算法来进行高斯混合模型的参数估计。
介绍了EM算法原理,及其在高斯混合模型中应用,并编程用matlab实现,评估其性能
高斯混合模型(EM算法)Matlab代码,并附有简单实例测试估计效果
EM算法用于混合高斯模型的参数估计的原理与算法实现(matlab);源码实现包括EM算法用于K均值问题的参数估计和EM算法用于混合高斯模型参数估计。
EM算法在高斯混合模型的参数估计中的应用,内服Matlab程序例子。
二维混合高斯分布的EM算法(matlab)
EM算法解决混合高斯模型问题。两个文件,一个是产生混合高斯数据,另一个是EM算法对混合高斯参数的估计
实际生活中的样本很多是无标签的我这些样本含有隐变量或者潜在变量。...在K个高斯混合模型中按照概率P(Y=i)选择一个高斯分布。 这个点在属于第i个高斯分布的条件下概率分布为X ~ N(μi,σi). 即:
EM算法求解高斯混合模型1
混合高斯分布EM算法,可以算混合高斯分布的三个参数。混合高斯分布更接近系数分布。
本文详细介绍了EM算法的步骤 分析,以及应用与高斯混合模型和隐马尔可夫过程参数估计的详细过程,英文版