❶ 急求如何用MATLab实现EM算法
最大期望算法(Expectation Maximization Algorithm,又译期望最大化算法),是一种迭代算法,用于含有隐变量(hidden variable)的概率参数模型的最大似然估计或极大后验概率估计。
实现代码如下:
02 Jul 2015 hui cheng
06 May 2015 Mei Dong
very good job!
12 Nov 2014 Jobaer
please, sir , send me a source code on image segmentation. I want to segement weeds from soil.My email address is [email protected] .
18 Jan 2014 HuangJunFeng HuangJunFeng
16 Dec 2013 widdy
19 Feb 2013 Tong Chu
01 Jan 2013 manas nag
sir
after executing this it is declaring that k is undefined
04 Dec 2012 Jason Rebello
Some people want to know how to view the segmented image. For example suppose you have two classes ie k=2; us the following code to view it
[row col] = size(ima);
final_img = zeros(row,col);
for i=1:row
for j=1:col
if mask(i,j)==1
final_img(i,j)=1;
else
final_img(i,j)=255;
end
end
end
imshow(final_img/255);
This is a naive way of viewing it .. you may have to change somethings if k>2. Anywayz hope it helps. The mask basically stores the segmented image.
16 Nov 2011 surya
great job.i am using the same algorithm in my project for x-ray images.can u please tell how to view the segmented image
Comment only
18 Feb 2010 prashanth
Sir, I am starting my project on the same subject. i was unable to find the algorithm psuedocode for em algorithm. kindly send me one at [email protected]. Also can u just tell me the explanation for the source code..
Comment only
21 Dec 2009 maria
Hi, could you please explain how I can use "mask" to see result of segmentation??
Comment only
17 Mar 2009 Patrick
Greetings Prof., Very nice .. could you please let me know what exactly does the mask variable store ? As what i see it classifies each pixel that falls within each class . Am i correct in that assumption?
Thanks
24 May 2008 darko brajicic
great job!
27 Apr 2008 Bilo Bilo
Thanks
15 Aug 2007 smiled fisher
06 Nov 2006 Karthik Raja T
HI, Greetings,can it for my color image segmentation ?
04 Sep 2006 Mikel Rodriguez
12 Jul 2006 carlos mas
03 May 2006 Mohamed Sami
look when u make a code u must show us the output to see it then u read ur code .. try to explain that with output we can see bye
❷ em算法原理
我最近也在看EM算法,主要是它在无监督学习中的应用,例子倒是没有,原理差不多弄明白了一些,其实是出于一种很自然的想法,似然度均值的最大化,但是中间有些问题就是在迭代的过程中似然度是单调增加的,这个证明过程比较繁琐,具体你在模式识别中的应用可以参考这个WiKi页:http://en.wikipedia.org/wiki/Expectation-maximization_algorithm
❸ EM算法怎么用在聚类上
k-means -> probabilistic model mixtures -> infinite probabilistic model mixtures(DP) 或者 infinite k-means
EM为含隐变量的概率模型提供了一个通用的框架。
而用于聚类的模型其实都是离散混合模型。有限混合或者无限混合(狄利克雷过程),离散混合模型一定是含有隐变量的。所以EM就可以用来求解了。你先选一个聚类模型。你的任务简单,就没得选GMM或者DPGMM。若任务复杂些,可以搞分层的,或者时序的。然后用EM求解即可,求解过程中还会用到采样或者变分,自己看想用哪个。
❹ em算法的EM算法
在统计计算中,最大期望(EM)算法是在概率(probabilistic)模型中寻找参数最大似然估计或者最大后验估计的算法,其中概率模型依赖于无法观测的隐藏变量(Latent Variable)。最大期望经常用在机器学习和计算机视觉的数据聚类(Data Clustering)领域。
最大期望算法经过两个步骤交替进行计算:
第一步是计算期望(E),利用对隐藏变量的现有估计值,计算其最大似然估计值;
第二步是最大化(M),最大化在 E 步上求得的最大似然值来计算参数的值。
M 步上找到的参数估计值被用于下一个 E 步计算中,这个过程不断交替进行。
总体来说,EM的算法流程如下:
1.初始化分布参数
2.重复直到收敛:
E步骤:估计未知参数的期望值,给出当前的参数估计。
M步骤:重新估计分布参数,以使得数据的似然性最大,给出未知变量的期望估计。
❺ 三维机器学习EM算法问题.
学习机器学习十大算法,相当于电脑的中级水平。
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。
算法中的指令描述的是一个计算,当其运行时能从一个初始状态和(可能为空的)初始输入开始,经过一系列有限而清晰定义的状态,最终产生输出并停止于一个终态。一个状态到另一个状态的转移不一定是确定的。随机化算法在内的一些算法,包含了一些随机输入。
形式化算法的概念部分源自尝试解决希尔伯特提出的判定问题,并在其后尝试定义有效计算性或者有效方法中成形。这些尝试包括库尔特·哥德尔、Jacques Herbrand和斯蒂芬·科尔·克莱尼分别于1930年、1934年和1935年提出的递归函数,阿隆佐·邱奇于1936年提出的λ演算,1936年Emil Leon Post的Formulation 1和艾伦·图灵1937年提出的图灵机。即使在当前,依然常有直觉想法难以定义为形式化算法的情况。
一,数据对象的运算和操作:计算机可以执行的基本操作是以指令的形式描述的。一个计算机系统能执行的所有指令的集合,成为该计算机系统的指令系统。一个计算机的基本运算和操作有如下四类:[1]
1,算术运算:加减乘除等运算
2,逻辑运算:或、且、非等运算
3,关系运算:大于、小于、等于、不等于等运算
4,数据传输:输入、输出、赋值等运算[1]
二,算法的控制结构:一个算法的功能结构不仅取决于所选用的操作,而且还与各操作之间的执行顺序有关。[
❻ EM算法有什么用
EM算法是求含有隐变量的极大似然估计,可以用于包含隐变量的参数估计
❼ 谁做过 EM算法 java实现
参考:
packagenlp;
/**
*@authorOrisun
*date2011-10-22
*/
importjava.util.ArrayList;
publicclassBaumWelch{
intM;//隐藏状态的种数
intN;//输出活动的种数
double[]PI;//初始状态概率矩阵
double[][]A;//状态转移矩阵
double[][]B;//混淆矩阵
ArrayList<Integer>observation=newArrayList<Integer>();//观察到的集合
ArrayList<Integer>state=newArrayList<Integer>();//中间状态集合
int[]out_seq={2,1,1,1,2,2,2,2,2,1,1,1,1,2,2,2,2,1,1,
1,1,1,2,2,2,1,1,1,1,1,2,1};//测试用的观察序列
int[]hidden_seq={1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,1,
1,1,1,1,2,2,2,1,1,1,1,1,1,1};//测试用的隐藏状态序列
intT=32;//序列长度为32
double[][]alpha=newdouble[T][];//向前变量
doublePO;
double[][]beta=newdouble[T][];//向后变量
double[][]gamma=newdouble[T][];
double[][][]xi=newdouble[T-1][][];
//初始化参数。Baum-Welch得到的是局部最优解,所以初始参数直接影响解的好坏
publicvoidinitParameters(){
M=2;
N=2;
PI=newdouble[M];
PI[0]=0.5;
PI[1]=0.5;
A=newdouble[M][];
B=newdouble[M][];
for(inti=0;i<M;i++){
A[i]=newdouble[M];
B[i]=newdouble[N];
}
A[0][0]=0.8125;
A[0][1]=0.1875;
A[1][0]=0.2;
A[1][1]=0.8;
B[0][0]=0.875;
B[0][1]=0.125;
B[1][0]=0.25;
B[1][1]=0.75;
observation.add(1);
observation.add(2);
state.add(1);
state.add(2);
for(intt=0;t<T;t++){
alpha[t]=newdouble[M];
beta[t]=newdouble[M];
gamma[t]=newdouble[M];
}
for(intt=0;t<T-1;t++){
xi[t]=newdouble[M][];
for(inti=0;i<M;i++)
xi[t][i]=newdouble[M];
}
}
//更新向前变量
publicvoipdateAlpha(){
for(inti=0;i<M;i++){
alpha[0][i]=PI[i]*B[i][observation.indexOf(out_seq[0])];
}
for(intt=1;t<T;t++){
for(inti=0;i<M;i++){
alpha[t][i]=0;
for(intj=0;j<M;j++){
alpha[t][i]+=alpha[t-1][j]*A[j][i];
}
alpha[t][i]*=B[i][observation.indexOf(out_seq[t])];
}
}
}
//更新观察序列出现的概率,它在一些公式中当分母
publicvoipdatePO(){
for(inti=0;i<M;i++)
PO+=alpha[T-1][i];
}
//更新向后变量
publicvoipdateBeta(){
for(inti=0;i<M;i++){
beta[T-1][i]=1;
}
for(intt=T-2;t>=0;t--){
for(inti=0;i<M;i++){
for(intj=0;j<M;j++){
beta[t][i]+=A[i][j]
*B[j][observation.indexOf(out_seq[t+1])]
*beta[t+1][j];
}
}
}
}
//更新xi
publicvoipdateXi(){
for(intt=0;t<T-1;t++){
doublefrac=0.0;
for(inti=0;i<M;i++){
for(intj=0;j<M;j++){
frac+=alpha[t][i]*A[i][j]
*B[j][observation.indexOf(out_seq[t+1])]
*beta[t+1][j];
}
}
for(inti=0;i<M;i++){
for(intj=0;j<M;j++){
xi[t][i][j]=alpha[t][i]*A[i][j]
*B[j][observation.indexOf(out_seq[t+1])]
*beta[t+1][j]/frac;
}
}
}
}
//更新gamma
publicvoipdateGamma(){
for(intt=0;t<T-1;t++){
doublefrac=0.0;
for(inti=0;i<M;i++){
frac+=alpha[t][i]*beta[t][i];
}
//doublefrac=PO;
for(inti=0;i<M;i++){
gamma[t][i]=alpha[t][i]*beta[t][i]/frac;
}
//for(inti=0;i<M;i++){
//gamma[t][i]=0;
//for(intj=0;j<M;j++)
//gamma[t][i]+=xi[t][i][j];
//}
}
}
//更新状态概率矩阵
publicvoipdatePI(){
for(inti=0;i<M;i++)
PI[i]=gamma[0][i];
}
//更新状态转移矩阵
publicvoipdateA(){
for(inti=0;i<M;i++){
doublefrac=0.0;
for(intt=0;t<T-1;t++){
frac+=gamma[t][i];
}
for(intj=0;j<M;j++){
doubledem=0.0;
//for(intt=0;t<T-1;t++){
//dem+=xi[t][i][j];
//for(intk=0;k<M;k++)
//frac+=xi[t][i][k];
//}
for(intt=0;t<T-1;t++){
dem+=xi[t][i][j];
}
A[i][j]=dem/frac;
}
}
}
//更新混淆矩阵
publicvoipdateB(){
for(inti=0;i<M;i++){
doublefrac=0.0;
for(intt=0;t<T;t++)
frac+=gamma[t][i];
for(intj=0;j<N;j++){
doubledem=0.0;
for(intt=0;t<T;t++){
if(out_seq[t]==observation.get(j))
dem+=gamma[t][i];
}
B[i][j]=dem/frac;
}
}
}
//运行Baum-Welch算法
publicvoidrun(){
initParameters();
intiter=22;//迭代次数
while(iter-->0){
//E-Step
updateAlpha();
//updatePO();
updateBeta();
updateGamma();
updatePI();
updateXi();
//M-Step
updateA();
updateB();
}
}
publicstaticvoidmain(String[]args){
BaumWelchbw=newBaumWelch();
bw.run();
System.out.println("训练后的初始状态概率矩阵:");
for(inti=0;i<bw.M;i++)
System.out.print(bw.PI[i]+" ");
System.out.println();
System.out.println("训练后的状态转移矩阵:");
for(inti=0;i<bw.M;i++){
for(intj=0;j<bw.M;j++){
System.out.print(bw.A[i][j]+" ");
}
System.out.println();
}
System.out.println("训练后的混淆矩阵:");
for(inti=0;i<bw.M;i++){
for(intj=0;j<bw.N;j++){
System.out.print(bw.B[i][j]+" ");
}
System.out.println();
}
}
}
❽ em算法为什么可以解决隐含数据问题
EM算法可以看成是特殊情况下计算极大似然的一种算法。
现实的数据经常有一些比较奇怪的问题,比如缺失数据、含有隐变量等问题。当这些问题出现的时候,计算极大似然函数通常是比较困难的,而EM算法可以解决这个问题。
EM算法已经有很多应用,比如最经典的Hidden Markov模型等。
❾ em算法的EM算法简述
迭代使用EM步骤,直至收敛。
可以有一些比较形象的比喻说法把这个算法讲清楚。比如说食堂的大师傅炒了一份菜,要等分成两份给两个人吃,显然没有必要拿来天平一点一点的精确的去称分量,最简单的办法是先随意的把菜分到两个碗中,然后观察是否一样多,把比较多的那一份取出一点放到另一个碗中,这个过程一直迭代地执行下去,直到大家看不出两个碗所容纳的菜有什么分量上的不同为止。EM算法就是这样,假设我们估计知道A和B两个参数,在开始状态下二者都是未知的,并且知道了A的信息就可以得到B的信息,反过来知道了B也就得到了A。可以考虑首先赋予A某种初值,以此得到B的估计值,然后从B的当前值出发,重新估计A的取值,这个过程一直持续到收敛为止。
EM 算法是 Dempster,Laind,Rubin 于 1977 年提出的求参数极大似然估计的一种方法,它可以从非完整数据集中对参数进行 MLE 估计,是一种非常简单实用的学习算法。这种方法可以广泛地应用于处理缺损数据,截尾数据,带有噪声等所谓的不完全数据(incomplete data)。
假定集合Z = (X,Y)由观测数据 X 和未观测数据Y 组成,X 和Z = (X,Y)分别称为不完整数据和完整数据。假设Z的联合概率密度被参数化地定义为P(X,Y|Θ),其中Θ表示要被估计的参数。Θ的最大似然估计是求不完整数据的对数似然函数L(X;Θ)的最大值而得到的:
L(Θ;X)= log p(X|Θ) = ∫log p(X,Y|Θ)dY ;
EM算法包括两个步骤:由E步和M步组成,它是通过迭代地最大化完整数据的对数似然函数Lc(X;Θ)的期望来最大化不完整数据的对数似然函数,其中:
Lc(X;Θ) =log p(X,Y |Θ) ;
假设在算法第t次迭代后Θ获得的估计记为Θ(t) ,则在(t+1)次迭代时,
E-步:计算完整数据的对数似然函数的期望,记为:
Q(Θ|Θ (t)) = E{Lc(Θ;Z)|X;Θ(t)};
M-步:通过最大化Q(Θ|Θ(t) ) 来获得新的Θ 。
通过交替使用这两个步骤,EM算法逐步改进模型的参数,使参数和训练样本的似然概率逐渐增大,最后终止于一个极大点。直观地理解EM算法,它也可被看作为一个逐次逼近算法:事先并不知道模型的参数,可以随机的选择一套参数或者事先粗略地给定某个初始参数λ0 ,确定出对应于这组参数的最可能的状态,计算每个训练样本的可能结果的概率,在当前的状态下再由样本对参数修正,重新估计参数λ,并在新的参数下重新确定模型的状态,这样,通过多次的迭代,循环直至某个收敛条件满足为止,就可以使得模型的参数逐渐逼近真实参数。
EM算法的主要目的是提供一个简单的迭代算法计算后验密度函数,它的最大优点是简单和稳定,但容易陷入局部最优。
❿ em算法是什么
最大期望算法(Expectation-Maximization algorithm, EM),或Dempster-Laird-Rubin算法,是一类通过迭代进行极大似然估计(Maximum Likelihood Estimation, MLE)的优化算法 ,通常作为牛顿迭代法(Newton-Raphson method)的替代用于对包含隐变量(latent variable)或缺失数据(incomplete-data)的概率模型进行参数估计。
EM算法的标准计算框架由E步(Expectation-step)和M步(Maximization step)交替组成,算法的收敛性可以确保迭代至少逼近局部极大值 。EM算法是MM算法(Minorize-Maximization algorithm)的特例之一,有多个改进版本,包括使用了贝叶斯推断的EM算法、EM梯度算法、广义EM算法等 。
由于迭代规则容易实现并可以灵活考虑隐变量,EM算法被广泛应用于处理数据的缺测值 ,以及很多机器学习(machine learning)算法,包括高斯混合模型(Gaussian Mixture Model, GMM) 和隐马尔可夫模型(Hidden Markov Model, HMM) 的参数估计。