EM算法具体过程看前一篇博客

一、matlab实现

1.matlab代码

close all;
clear;
clc;%%
M=3;          % 高斯数量
N=600;        % 数据样本总数
th=0.000001;  % 聚合阀值
K=2;          % 输出信号保留% 待生成数据的参数
a_real =[2/3;1/6;1/6];
mu_real=[3 4 6;5 3 7];
cov_real(:,:,1)=[5 0;0 0.2];
cov_real(:,:,2)=[0.1 0;0 0.1];
cov_real(:,:,3)=[0.1 0;0 0.1];
% 这里生成的数据全部符合标准
x=[ mvnrnd( mu_real(:,1) , cov_real(:,:,1) , round(N*a_real(1)) )' ,...mvnrnd( mu_real(:,2) , cov_real(:,:,2) , round(N*a_real(2)) )' ,...mvnrnd( mu_real(:,3) , cov_real(:,:,3) , round(N*a_real(3)) )' ];figure(1),plot(x(1,:),x(2,:),'.')%% EM
% 参数初始化
a=[1/3,1/3,1/3]; %各类的比例(权重)
mu=[1 2 3;       %均值初始化2 1 4];
cov(:,:,1)=[1 0; %协方差初始化0 1];
cov(:,:,2)=[1 0;0 1];
cov(:,:,3)=[1 0;0 1];t=inf;
count=0;
figure(2),hold on
while t>=tha_old  = a;mu_old = mu;cov_old= cov;      rznk_p=zeros(M,N);%生成M行N列零矩阵for cm=1:Mmu_cm=mu(:,cm);cov_cm=cov(:,:,cm);for cn=1:N  %计算Pi(x)p_cm=exp(-0.5*(x(:,cn)-mu_cm)'/cov_cm*(x(:,cn)-mu_cm));rznk_p(cm,cn)=p_cm;endrznk_p(cm,:)=rznk_p(cm,:)/sqrt(det(cov_cm));endrznk_p=rznk_p*(2*pi)^(-K/2);
%E step%开始求rznk 相当于Pr(i|Xt)rznk=zeros(M,N);%r(Zpikn=zeros(1,M);%r(Zpikn_sum=0;for cn=1:Nfor cm=1:M%计算p(x|*)概率分布pikn(1,cm)=a(cm)*rznk_p(cm,cn);
%           pikn_sum=pikn_sum+pikn(1,cm);endfor cm=1:Mrznk(cm,cn)=pikn(1,cm)/sum(pikn);endend%求rank结束
% M stepnk=zeros(1,M);for cm=1:Mfor cn=1:Nnk(1,cm)=nk(1,cm)+rznk(cm,cn);endenda=nk/N;rznk_sum_mu=zeros(M,1);% 求均值MU%nk(cm)  相当于ni%rznk_sum_mu  ni*Xtfor cm=1:Mrznk_sum_mu=0;for cn=1:Nrznk_sum_mu=rznk_sum_mu+rznk(cm,cn)*x(:,cn);endmu(:,cm)=rznk_sum_mu/nk(cm);end% 求协方差COV   for cm=1:Mrznk_sum_cov=zeros(K,K);for cn=1:N%求协方差(Hi-u)^2rznk_sum_cov=rznk_sum_cov+rznk(cm,cn)*(x(:,cn)-mu(:,cm))*(x(:,cn)-mu(:,cm))';endcov(:,:,cm)=rznk_sum_cov/nk(cm);endt=max([norm(a_old(:)-a(:))/norm(a_old(:));norm(mu_old(:)-mu(:))/norm(mu_old(:));norm(cov_old(:)-cov(:))/norm(cov_old(:))]);temp_f=sum(log(sum(pikn)));plot(count,temp_f,'r+')count=count+1;
end  %while hold off
f=sum(log(sum(pikn)));% 输出结果
a
mu
covfigure(3),
hold on
plot(x(1,:),x(2,:),'k.');
plot(mu_real(1,:),mu_real(2,:),'*c');
plot(mu(1,:),mu(2,:),'+r');
hold offfigure(4),
hold on
for i=1:N[max_temp,ind_temp]=max(rznk(:,i));if ind_temp==1plot(x(1,i),x(2,i),'k.');endif ind_temp==2plot(x(1,i),x(2,i),'b.');endif ind_temp==3plot(x(1,i),x(2,i),'r.');end
end%fcm聚类
[center, U, OBJ_FCN]=fcm(x',3);
figure(5),
hold on
for i=1:N[max_temp,ind_temp]=max(U(:,i));if ind_temp==1plot(x(1,i),x(2,i),'k.');endif ind_temp==2plot(x(1,i),x(2,i),'b.');endif ind_temp==3plot(x(1,i),x(2,i),'r.');end
endplot(center(:,1),center(:,2),'c*')hold off

2.结果显示


二、Java实现

编译工具为:eclipse
1.Java代码

package cn.sxt.oo2;/*** 一維情況下的EM算法實現*1、求期望(e-step)*2、期望最大化(估值)(M-step)*3、循環以上兩部直到收斂*/
public class MyEM {private static final double[] points={1.0,1.3,2.2,2.6,2.8,5.0,7.3,7.4,7.5,7.7,7.9};private static double[][] w;//权值private static double[] means = {7.7,2.3};//均值private static double[] variances= {1,1};//方差private static double[] probs = {0.5,0.5};//每个类的概率;这里默认选择k=2了;/*** 高斯分布计算公式,也就是先验概率*///p(x|c)的计算private static double gaussianPro(double point,double mean,double variance){double prob = 0.0;prob = (1/(Math.sqrt(2*Math.PI)*Math.sqrt(variance)))*Math.exp(-(point-mean)*(point-mean)/(2*variance));return prob;}/*** E-step的主要逻辑*/private static double[][] countPostprob(double[] means,double[] variances,double[] points,double[] probs){int clusterNum = means.length;int pointNum = points.length;double[][] postProbs = new double[clusterNum][pointNum];  double[] denominator = new double[pointNum];for(int m = 0;m <pointNum;m++){denominator[m] = 0.0;for(int n = 0;n<clusterNum;n++){denominator[m]+=(gaussianPro(points[m], means[n], variances[n])*probs[n]);}}for(int i = 0;i<clusterNum;i++){for(int j = 0;j<pointNum;j++){postProbs[i][j]=(gaussianPro(points[j], means[i], variances[i])*probs[i])/(denominator[j]);}}return postProbs;}private static void  eStep(){w = countPostprob(means, variances, points, probs);}/*** M-step的主要逻辑之一:由E-step得到的期望,重新计算均值*/private static double[] guessMean(double[][] w,double[] points){int wLength = w.length;double[] means = new double[w.length];double[] wi = new double[wLength];for (int m = 0; m < wLength; m++) {wi[m] = 0.0;for(int n = 0; n<points.length;n++){wi[m] += w[m][n];}}for(int i = 0;i<w.length;i++){means[i] = 0.0;for(int j = 0;j<points.length;j++){means[i]+=(w[i][j]*points[j]);}means[i] /= wi[i];}return means;}/*** M-step的主要逻辑之一:由E-step得到的期望,重新计算方差*/private static double[] guessVariance(double[][] w,double[] points){int wLength = w.length;double[] means = new double[w.length];double[] variances = new double[wLength];double[] wi = new double[wLength];for (int m = 0; m < wLength; m++) {wi[m] = 0.0;for(int n = 0; n<points.length;n++){wi[m] += w[m][n];}}means = guessMean(w, points);for(int i = 0;i<wLength;i++){variances[i] = 0.0;for(int j = 0;j<points.length;j++){variances[i] +=(w[i][j]*(points[j]-means[i])*(points[j]-means[i])); }variances[i] /= wi[i];}return variances;}/*** M-step的主要逻辑之一:由E-step得到的期望,重新计算概率**/private static double[] guessProb(double[][] w){int wLength = w.length;double[] probs = new double[wLength];for(int i = 0;i<wLength;i++){probs[i] = 0.0;for(int j = 0;j<w[i].length;j++){probs[i]+=w[i][j];}probs[i] /=w[i].length;}return probs;}private static void mStep(){means = guessMean(w, points);variances = guessVariance(w, points);probs = guessProb(w);}/*** 计算前后两次迭代的参数的差值* */private static double threshold(double[] bef_values,double[] values){double diff = 0.0;for(int i = 0 ; i < values.length;i++){diff += (values[i]-bef_values[i]);}return Math.abs(diff);}public static void main(String[] args)throws Exception{int k = 2;w = new double[k][points.length];double[] bef_means;double[] bef_var;do{bef_means = means;bef_var = variances;eStep();mStep();}while(threshold(bef_means, means)<0.01&&threshold(bef_var, variances)<0.01);for(double prob:probs)System.out.println(prob);   }
}

2.结果显示

EM算法matlab和Java实现相关推荐

  1. em算法matlab图像应用,em算法matlab程序

    EM 算法作业 EM 算法简单 介绍及应用 EM 算法是当存在数据缺失问题时,极... Matlab 实现根据以上推导,可以很容易实现 EM 算法估计 GMM 参数.现... 题目:matlab 实现 ...

  2. GMM高斯混合模型及EM算法(matlab实现)

    单元 %绘制男女生身高的GMM clc clear all %男女生共取2000人,女生平均身高163,男声平均身高180 male=180+sqrt(10)*randn(1,1000); %产生均值 ...

  3. 朴素贝叶斯算法matlab实现以及EM算法

    这周,继续学习了朴素贝叶斯算法的一部分知识,看了matlab的贝叶斯分类算法.采用草地潮湿原因模型的一个例子来求证贝叶斯概率以及条件概率.联合概率的分析,详见日志http://blog.sina.co ...

  4. 视觉机器学习20讲-MATLAB源码示例(7)-EM算法

    视觉机器学习20讲-MATLAB源码示例(7)-EM算法 1. EM算法 2. Matlab仿真 3. 仿真结果 4. 小结 1. EM算法 最大期望算法(Expectation-Maximizati ...

  5. 使用EM算法估计GMM参数的原理及matlab实现

    相关数学概念 协方差矩阵 多维高斯分布 其中k=n,即x的维度. GMM的原理 GMM,高斯混合模型,是一种聚类算法. 1.GMM概念: -将k个高斯模型混合在一起,每个点出现的概率是几个高斯混合的结 ...

  6. em算法的java实现_EM算法 - Java教程 - 找一找教程网

    1.背景 2.理论 2.1.Jensen不等式 优化理论中,假设 \(f\) 是定义域为实数的函数,如果对于所有的实数 \(x\) ,且二阶导数\(f''(x)\geq 0\) ,则 \(f\) 是凸 ...

  7. java em算法_python em算法的实现

    ''' 数据集:伪造数据集(两个高斯分布混合) 数据集长度:1000 ------------------------------ 运行结果: ---------------------------- ...

  8. gmm的java实现_4. EM算法-高斯混合模型GMM详细代码实现

    1. 前言 EM的前3篇博文分别从数学基础.EM通用算法原理.EM的高斯混合模型的角度介绍了EM算法.按照惯例,本文要对EM算法进行更进一步的探究.就是动手去实践她. 2. GMM实现 我的实现逻辑基 ...

  9. em算法的java实现_机器学习——python模拟EM算法

    <统计学习方法> 李航著 第九章 EM算法 我是小白一个:本文代码转载地址文末有注释:除代码和部分注释外大部分自己书写,有问题请多指教 模拟课本第一个例子,即用EM算法估计三个硬币模型的参 ...

最新文章

  1. 双样本T检验——机器学习特征工程相关性分析实战
  2. Latex中bib文件制作(参考文献制作)
  3. Jenkins 基础入门
  4. word交叉引用插入文献后更新域之后编号未更新
  5. 飞鸽传书:摆一摆自己的C++程序设计入行历程
  6. 加州大学欧文分校 计算机专业,加州大学欧文分校计算机科学排名第36(2020年TFE美国排名)...
  7. python 空列表对象的布尔值_python – 从TensorFlow对象中检索数据 – 来自correct_prediction的布尔值列表...
  8. indesign教程,如何使用共享交互式文档?
  9. 第一章:SQL Server 数据库环境搭建与使用
  10. 基于Halcon学习的二维码识别【六】pdf417_bottle.hdev
  11. 树莓派 Ubuntu 18.04 启动2.4Ghz或5Ghz热点及部分5G信道启动失败解决方法
  12. 服务器显卡驱动重装系统,windows7旗舰版系统重装显卡驱动的方法
  13. NGINX Sprint 年度线上会议:报名通道已开启,立即预定您的 NGINX 深潜之旅
  14. 大龄程序员的成长之路
  15. cad二次开发-线段合并
  16. 入门级运动蓝牙耳机之好评之王!
  17. 剑灵盛世服务器位置,剑灵盛世再临活动网址 剑灵周年回归礼包领取地址
  18. 矩阵的特性和运算法则
  19. Mac 解决 gyp: No Xcode or CLT version detected! 报错
  20. UE4_UStruct 遍历

热门文章

  1. 如何linux查看mysql目录下日志_测试人员如何在linux服务器中查询mysql日志?
  2. mave工程中的一个类调用另一个聚合工程的一个类_谈谈设计模式:建造者模式在jdk中的体现,它和工厂模式区别?...
  3. Soring冲刺计划第三天(个人)
  4. 122 Best Time to Buy and Sell Stock II 买卖股票的最佳时机 II
  5. 原生ajax封装,数据初始化,
  6. XHProf报告字段含义
  7. 《图说VR入门》——DeepoonVR的大鹏(陀螺仪)枪
  8. cmd编译运行Java文件详解
  9. [VMM 2008虚拟化之初体验-2] 界面功能介绍
  10. 分析解决Java运行时异常