算法特点

GMM聚类与Keams聚类很相似。K-means是将每个数据点分配到某一个类别中,而GMM则是给出这些数据点被分配到每个类别的概率,又叫做soft assignment。其除了被用在clustering上,还经常被用于density estimation上。

得出一个概率有很多的好处,因为它的信息量比简单的一个结果要多。这个概率可以被看做是得出这个结果的把握。比如说,在诸如疾病诊断时,算法得出49%的概率患病,为51%的概率正常,如果仅仅用50%的阈值将患者诊断为“正常”的话,风险是非常大的,也就是说得出正常的结果的把握是非常小的。这个情况下,就会拒绝发表评论,而把这个任务留给有经验的医生去解决。

学习的过程可以看做是一种“归纳”的过程,在归纳的时候需要有一个提前假设,即“归纳偏置”。比如说线性回归,它的归纳偏执就是“数据是符合线性函数的,满足要求的函数必须是线性函数”。如果去掉“线性函数”这个归纳偏执,那么就会产生过拟合的问题,我们就可以构造n-1次多项式函数,让它完美的穿过所有的N的点,甚至可以构造出无数个满足条件的函数。然而,我们学习的目的通常不是解释现有的事物,而是从中归纳知识,并且能够应用到新的事物上。

没有归纳偏执或者归纳偏执太宽泛会导致过拟合,而限制过大的归纳偏执也是有问题的;比如说,如果数据不是非线性分布的,强行的使用非线性函数去做分类通常并不能够得到好的结果。难点就是在这之间找到一个平衡点。

混合高斯模型的归纳偏执很明显,就是假设数据符合混合高斯分布,也就是看作数据是从多个高斯分布中生成而来。混合模型其实是可以变的任意复杂的,通过增加模型的个数,我们可以任意的逼近任何连续的概率密度分布。

主程序:

clear;

clc;

%从实验结果可以看出先使用Keams方法计算初始点,再使用GMM进行聚类得到的结果

%明显优于直接使用GMM方法进行聚类得到的结果

%数据X1和X2的真实均值为[1,1;4,4;8,1]

%协方差矩阵均为[2,0;0,2];

%数据集X1的混合系数为[1/3,1/3,1/3]

%数据集X2的混合系数为[0.6,0.3,0.1]

[X1,X2]=generateData();

K=3;

%数据集X1

[a_init,mu_init,sigma_init]=initPara(X1);

[a_GMM,mu_GMM,sigma_GMM]=GMM(X1,a_init,mu_init,sigma_init);

[centroids,~] = Kmeans( X1,mu_init,K);

disp('1.Keams算法执行后数据集X1的均值为:')

disp(centroids);

disp('2.GMM后高斯混合模型数据集X1的均值,协方差矩阵为:');

disp('均值为:');

disp(mu_GMM);

disp('协方差矩阵为:')

disp(sigma_GMM);

disp(['混合系数为:',num2str(a_GMM)]);

[a_Kea_GMM,mu_Kea_GMM,sigma_Kea_GMM]=GMM(X1,a_init,centroids,sigma_init);

disp('3.使用Keams计算初始均值再使用GMM进行聚类后的数据集X1的均值,协方差矩阵为:');

disp('均值为:');

disp(mu_Kea_GMM);

disp('协方差矩阵为:')

disp(sigma_Kea_GMM);

disp(['混合系数为:',num2str(a_Kea_GMM)]);

%数据集X2

[a_init,mu_init,sigma_init]=initPara(X2);

[a_fin,mu_fin,sigma_GMM]=GMM(X2,a_init,mu_init,sigma_init);

[centroids,~] = Kmeans( X2,mu_init,K);

disp('1.Keams算法执行后数据集X2的均值为:')

disp(centroids);

disp('2.GMM后高斯混合模型数据集X2的均值,协方差矩阵为:');

disp('均值为:');

disp(mu_GMM);

disp('协方差矩阵为:')

disp(sigma_GMM);

disp(['混合系数为:',num2str(a_GMM)]);

[a_Kea_GMM,mu_Kea_GMM,sigma_Kea_GMM]=GMM(X2,a_init,centroids,sigma_init);

disp('3.使用Keams计算初始均值再使用GMM进行聚类后的数据集X2的均值,协方差矩阵为:');

disp('均值为:');

disp(mu_Kea_GMM);

disp('协方差矩阵为:')

disp(sigma_Kea_GMM);

disp(['混合系数为:',num2str(a_Kea_GMM)]);

首先根据均值协方差矩阵混合系数生成高斯混合分布数据:

function [X1,X2]=generateData()

mu=[1,1;4,4;8,1];

sigma=[2,0;0,2];

a1=[1/3,1/3,1/3];

a2=[0.6,0.3,0.1];

N=1000;

rand1=randsrc(N,1,[[1,2,3];a1]);

rand2=randsrc(N,1,[[1,2,3];a2]);

X1=[];

X2=[];

mean1=[];

for i=1:size(a1,2)

X1_temp=mvnrnd(mu(i,:),sigma,length(find(rand1==i)));

X1=[X1;X1_temp];

subplot(1,2,1);

plot(X1_temp(:,1),X1_temp(:,2),'+');

title('X1');

legend('模型1','模型2','模型3');

xlabel('x');ylabel('y');

hold on;

mean1=[mean1;mean(X1_temp)];

cov1(:,:,i)=cov(X1_temp);

X2_temp=mvnrnd(mu(i,:),sigma,length(find(rand2==i)));

X2=[X2;X2_temp];

subplot(1,2,2);

plot(X2_temp(:,1),X2_temp(:,2),'*');

title('X2');

legend('模型1','模型2','模型3');

xlabel('x');ylabel('y');

hold on;

end

disp(['直接使用数据集X1来估计的属于三个模型随机矢量的均值分别为:']);

disp(mean1);

disp(['直接使用数据集X1来的属于三个模型随机矢量的协方差矩阵分别为:']);

disp(cov1);

end

初始化参数:

function [ a,mu,sigma ] = initPara(X)

[m,n]=size(X);

r=randperm(m);

mu=X(r(1:3),:);

a=[1/3,1/3,1/3];

sigma=[1,0;0,1];

end

GMM算法:

function [a_fin,mu_fin,sigma_fin]=GMM(X1,a_init,mu_init,sigma_init)

%UNTITLED2 此处显示有关此函数的摘要

% 此处显示详细说明

K=size(a_init,2);

[M,N]=size(X1);

a=a_init;

mu=mu_init;

sigma=sigma_init;

px=zeros(M,K);

thre=1e-5;

LLD_pro=inf;

while true

for i=1:K

px(:,i)=mvnpdf(X1,mu(i,:),sigma);

end

pGramm=repmat(a,M,1).*px;

pGramm=pGramm./repmat(sum(pGramm,2),1,K);

Nk=sum(pGramm,1); %1*K

mu=diag(1./Nk)*pGramm'*X1;

for kk=1:K

Xshift=X1-repmat(mu(kk,:),M,1);

sigma(:,:,kk)=(Xshift'*diag(pGramm(:,kk))*Xshift)/Nk(:,kk);

end

a=Nk/M;

LLD=sum(log(a*px'));

if (LLD-LLD_pro)

break;

end

LLD_pro=LLD;

end

a_fin=a;

mu_fin=mu;

sigma_fin=sigma;

end

Keams:

function [ centroids,centroidsIndex ] = Kmeans( X,mu_init,K)

centroids=mu_init;

thre=1e-5;

while true

pro_centroids=centroids;

[centroidsIndex]=findCloestCentroids(X,centroids,K);

[centroids]=computeCentroids(centroidsIndex,X,K);

if norm(centroids-pro_centroids)

break;

end

end

function [centroidsIndex]=findCloestCentroids(X,centroids,K)

[M,~]=size(X);

distMat=zeros(M,K);

centroidsIndex=zeros(M,1);

for i=1:M

for j=1:K

distMat(i,j)=norm(X(i,:)-centroids(j,:));

end

centroidsIndex(i,:)=find(distMat(i,:)==min(distMat(i,:)));

end

end

function [centroids]=computeCentroids(centroidsIndex,X,K)

[M,N]=size(X);

centroids=zeros(K,N);

for i=1:K

centroidsNum=sum(centroidsIndex==i);

centroids(i,:)=sum(X(centroidsIndex==i,:))./centroidsNum;

end

end

算法问题

GMM和K-means有同样的问题,如果初始值选择的不好,那么可能会得到局部最优解,得不到全局最优解。我们可以先使用K-means方法得到的结果作为初始值传给GMM模型,再使用GMM进行细致迭代。 GMM本身只是一个模型,EM算法并不是唯一的求解方法。

matlab gmm,GMM聚类及Matlab代码实现相关推荐

  1. matlab实现谱聚类法图像分割代码,一种基于谱聚类的图像分割方法与系统与流程...

    本发明是一种基于谱聚类的图像分割方法与系统,涉及聚类.机器学习和人工智能领域.特别涉及通过相关性将已经学习到的知识运用到图像分割中,并在此基础上构造性地改造谱聚类方法,从而达到快速精确地分割彩色图像的 ...

  2. GMM聚类及Matlab代码实现

    算法特点 GMM GMM聚类与Keams聚类很相似.K-means是将每个数据点分配到某一个类别中,而GMM则是给出这些数据点被分配到每个类别的概率,又叫做soft assignment.其除了被用在 ...

  3. GMM / MoG 聚类 Matlab 可视化 实现

    GMM / MoG 聚类 Matlab 可视化 实现 GMM介绍 EM进行参数求解 GMM动态可视化 GMM的Matlab动态可视化代码 参考书籍:<计算机视觉 模型.学习和推理> GMM ...

  4. 聚类分析matlab检验,「matlab聚类分析」聚类分析的Matlab 程序—系统聚类(附有案例分析) - 金橙教程网...

    matlab聚类分析 聚类分析的Matlab 程序-系统聚类 (1)计算数据集每对元素之间的距离,对应函数为pdistw. 调用格式:Y=pdist(X),Y=pdist(X,'metric'), Y ...

  5. ncut算法matlab程序,Ncut算法的MATLAB代码下载及实现在MATLAB上正常运行

    这里我所使用的平台是:win7(64bit)+MATLAB2014a(64bit) Ncut算法全称应该是:Multiscale Normalized Cut image segmentation,是 ...

  6. 【老生谈算法】matlab实现Kmeans聚类算法源码——Kmeans聚类算法

    matlab实现Kmeans聚类算法代码实现 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]matlab实现Kmeans聚类 ...

  7. 彩色matlab代码拷贝到word研究,matlab编辑器合并_彩色MATLAB代码拷贝到WORD研究

    公众号:理念世界的影子 文不可无观点,观点不可无论据. 转载请注明出处 结果简单,重在过程 有时将彩色Matlab代码拷贝到Word中,可能出现彩色消失.中文乱码.没有行号.字体不佳等问题.已有的措施 ...

  8. MATLAB的超效率SBM-DEA模型代码 可以做期望产出和非期望产出的超效率和非超效率sbm模型和Malmquist指数和分解

    MATLAB的超效率SBM-DEA模型代码(有安装教程和内容讲解之类的东西),操作很简单 可以做期望产出和非期望产出的超效率和非超效率sbm模型和Malmquist指数和分解 ID:669695527 ...

  9. matlab中的聚类算法,kmeans聚类算法matlab matlab 聚类算法silhouette

    怎样用matlab实现多维K-means聚类算法小编觉得一个好的周末应该是这样的:睡到中午醒来,在床上躺着玩两个小时手机,起床随便吃点东西,下午去超市买一大堆零食,五六点的时候去约小伙伴们吃火锅烧烤, ...

  10. matlab silhouette函数,相当于Matlab的聚类质量函数?

    我在下面展示了一个在MATLAB和Python/Numpy中的示例silhouette实现(请记住,我对MATLAB比较流利): 1) MATLAB语言function s = mySilhouett ...

最新文章

  1. html region 折叠,js代码折叠的方法//#region 代码 //#endregion
  2. python-15:装饰函数之一
  3. OpenGL屏幕空间环境光遮挡的实例
  4. mvc中html对象的方法吗,在MVC中使用jQuery模板进行HTML编码的Json对象
  5. verilog将像素数据写入txt_FPGA仿真必备(1)——Matlab生成.mif文件/.txt文件
  6. 设计糟糕的 RESTful API 就是在浪费时间!
  7. 3.指定IP地址抓包
  8. 一起谈.NET技术,关于Expression Tree和IL Emit的所谓的quot;性能差别quot;
  9. IO模型《二》阻塞IO
  10. Chinese-ELECTRA ‘adam_m not found in checkpoint ‘
  11. tableau最大值最小值显示
  12. 马克思 第一章 世界的物质性及其发展规律
  13. dw改透明度_div 背景透明度 如何设置一个div的背景透明度
  14. 群晖nas安装php,在群晖NAS上运行URLOS之后竟然能安装Discuz! Q!!
  15. asp.net保存图片
  16. 实际业务中的数据分析流程和痛点
  17. 发送打印命令后打印机没反应,重启打印机之后才能打印
  18. python玩王者荣耀皮肤_爬取王者荣耀皮肤图片
  19. 新增一级菜单和子菜单
  20. iOS 高仿爱鲜蜂APP

热门文章

  1. 电脑文件删除不掉什么原因?程序显示被占用清理不掉如何操作?
  2. 2019_WSDM_Session-Based Social Recommendation via Dynamic Graph Attention Networks
  3. 短信平台通道搭建 wed网页版源码构架 路由通道多线搭建 后台管理系统的架构
  4. Fast Non-Bayesian Poisson Factorization for Implicit-Feedback Recommendations
  5. 如何解决取ADO的Recordset对象的RecordCount属性总是-1问题
  6. 各位老铁,善财读书会试运营了
  7. 图像的均值、均方值、方差、均方差、标准差
  8. u盘怎么装服务器系统教程,u盘装服务器系统教程
  9. Router路由守卫
  10. linux v4l2色调,V4L2下摄像头的详细参数调整