matlab gmm,GMM聚类及Matlab代码实现
算法特点
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代码实现相关推荐
- matlab实现谱聚类法图像分割代码,一种基于谱聚类的图像分割方法与系统与流程...
本发明是一种基于谱聚类的图像分割方法与系统,涉及聚类.机器学习和人工智能领域.特别涉及通过相关性将已经学习到的知识运用到图像分割中,并在此基础上构造性地改造谱聚类方法,从而达到快速精确地分割彩色图像的 ...
- GMM聚类及Matlab代码实现
算法特点 GMM GMM聚类与Keams聚类很相似.K-means是将每个数据点分配到某一个类别中,而GMM则是给出这些数据点被分配到每个类别的概率,又叫做soft assignment.其除了被用在 ...
- GMM / MoG 聚类 Matlab 可视化 实现
GMM / MoG 聚类 Matlab 可视化 实现 GMM介绍 EM进行参数求解 GMM动态可视化 GMM的Matlab动态可视化代码 参考书籍:<计算机视觉 模型.学习和推理> GMM ...
- 聚类分析matlab检验,「matlab聚类分析」聚类分析的Matlab 程序—系统聚类(附有案例分析) - 金橙教程网...
matlab聚类分析 聚类分析的Matlab 程序-系统聚类 (1)计算数据集每对元素之间的距离,对应函数为pdistw. 调用格式:Y=pdist(X),Y=pdist(X,'metric'), Y ...
- ncut算法matlab程序,Ncut算法的MATLAB代码下载及实现在MATLAB上正常运行
这里我所使用的平台是:win7(64bit)+MATLAB2014a(64bit) Ncut算法全称应该是:Multiscale Normalized Cut image segmentation,是 ...
- 【老生谈算法】matlab实现Kmeans聚类算法源码——Kmeans聚类算法
matlab实现Kmeans聚类算法代码实现 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]matlab实现Kmeans聚类 ...
- 彩色matlab代码拷贝到word研究,matlab编辑器合并_彩色MATLAB代码拷贝到WORD研究
公众号:理念世界的影子 文不可无观点,观点不可无论据. 转载请注明出处 结果简单,重在过程 有时将彩色Matlab代码拷贝到Word中,可能出现彩色消失.中文乱码.没有行号.字体不佳等问题.已有的措施 ...
- MATLAB的超效率SBM-DEA模型代码 可以做期望产出和非期望产出的超效率和非超效率sbm模型和Malmquist指数和分解
MATLAB的超效率SBM-DEA模型代码(有安装教程和内容讲解之类的东西),操作很简单 可以做期望产出和非期望产出的超效率和非超效率sbm模型和Malmquist指数和分解 ID:669695527 ...
- matlab中的聚类算法,kmeans聚类算法matlab matlab 聚类算法silhouette
怎样用matlab实现多维K-means聚类算法小编觉得一个好的周末应该是这样的:睡到中午醒来,在床上躺着玩两个小时手机,起床随便吃点东西,下午去超市买一大堆零食,五六点的时候去约小伙伴们吃火锅烧烤, ...
- matlab silhouette函数,相当于Matlab的聚类质量函数?
我在下面展示了一个在MATLAB和Python/Numpy中的示例silhouette实现(请记住,我对MATLAB比较流利): 1) MATLAB语言function s = mySilhouett ...
最新文章
- html region 折叠,js代码折叠的方法//#region 代码 //#endregion
- python-15:装饰函数之一
- OpenGL屏幕空间环境光遮挡的实例
- mvc中html对象的方法吗,在MVC中使用jQuery模板进行HTML编码的Json对象
- verilog将像素数据写入txt_FPGA仿真必备(1)——Matlab生成.mif文件/.txt文件
- 设计糟糕的 RESTful API 就是在浪费时间!
- 3.指定IP地址抓包
- 一起谈.NET技术,关于Expression Tree和IL Emit的所谓的quot;性能差别quot;
- IO模型《二》阻塞IO
- Chinese-ELECTRA ‘adam_m not found in checkpoint ‘
- tableau最大值最小值显示
- 马克思 第一章 世界的物质性及其发展规律
- dw改透明度_div 背景透明度 如何设置一个div的背景透明度
- 群晖nas安装php,在群晖NAS上运行URLOS之后竟然能安装Discuz! Q!!
- asp.net保存图片
- 实际业务中的数据分析流程和痛点
- 发送打印命令后打印机没反应,重启打印机之后才能打印
- python玩王者荣耀皮肤_爬取王者荣耀皮肤图片
- 新增一级菜单和子菜单
- iOS 高仿爱鲜蜂APP
热门文章
- 电脑文件删除不掉什么原因?程序显示被占用清理不掉如何操作?
- 2019_WSDM_Session-Based Social Recommendation via Dynamic Graph Attention Networks
- 短信平台通道搭建 wed网页版源码构架 路由通道多线搭建 后台管理系统的架构
- Fast Non-Bayesian Poisson Factorization for Implicit-Feedback Recommendations
- 如何解决取ADO的Recordset对象的RecordCount属性总是-1问题
- 各位老铁,善财读书会试运营了
- 图像的均值、均方值、方差、均方差、标准差
- u盘怎么装服务器系统教程,u盘装服务器系统教程
- Router路由守卫
- linux v4l2色调,V4L2下摄像头的详细参数调整