在下面这篇中,我们已经说明了如何对数据进行高斯混合分布聚类并绘制概率密度曲面及置信椭圆:https://slandarer.blog.csdn.net/article/details/121521677


那么这篇要解决的问题就是如何绘制聚类区域与边界:


1 工具函数

首先先把工具函数都给出一遍,之后讲解如何绘制绘制聚类区域与边界:

1.1 高斯混合模型聚类

function [Mu,Sigma,Pi,Class]=gaussKMeans(pntSet,K,initM)
% @author:slandarer
% ===============================================================
% pntSet  | NxD数组   | 点坐标集                                |
% K       | 数值      | 划分堆数量                              |
% --------+-----------+-----------------------------------------+
% Mu      | KxD数组   | 每一行为一类的坐标中心                  |
% Sigma   | DxDxK数组 | 每一层为一类的协方差矩阵                |
% Pi      | Kx1列向量 | 每一个数值为一类的权重(占比)            |
% Class   | Nx1列向量 | 每一个数值为每一个元素的标签(属于哪一类)|
% --------+-----------+-----------------------------------------+[N,D]=size(pntSet); % N:元素个数 | D:维数% 初始化数据===============================================================
if nargin<3initM='random';
end
switch initMcase 'random' % 随机取初始值[~,tIndex]=sort(rand(N,1));tIndex=tIndex(1:K);Mu=pntSet(tIndex,:);case 'dis'    % 依据各维度的最大最小值构建方向向量% 并依据该方向向量均匀取点作为初始中心       tMin=min(pntSet);tMax=max(pntSet);Mu=linspace(0,1,K)'*(tMax-tMin)+repmat(tMin,K,1);% case '依据个人需求自行添加'  % ... ...% ... ...
end% 一开始设置每一类有相同协方差矩阵和权重
Sigma(:,:,1:K)=repmat(cov(pntSet),[1,1,K]);
Pi(1:K,1)=(1/K);% latest coefficient:上一轮的参数
LMu=Mu;
LPi=Pi;
LSigma=Sigma;turn=0; %轮次% GMM/gauss_k_means主要部分================================================
while true% 计算所有点作为第k类成员时概率及概率和(不加权重)% 此处用了多次转置避免构建NxN大小中间变量矩阵% 而将过程中构建的最大矩阵缩小至NxD,显著减少内存消耗Psi=zeros(N,K);for k=1:KY=pntSet-repmat(Mu(k,:),N,1);Psi(:,k)=((2*pi)^(-D/2))*(det(Sigma(:,:,k))^(-1/2))*...exp(-1/2*sum((Y/Sigma(:,:,k)).*Y,2))';    end% 加入权重计算各点属于各类后验概率Gamma=Psi.*Pi'./sum(Psi.*Pi',2);% 大量使用矩阵运算代替循环,提高运行效率Mu=Gamma'*pntSet./sum(Gamma,1)';for k=1:KY=pntSet-repmat(Mu(k,:),N,1);Sigma(:,:,k)=(Y'*(Gamma(:,k).*Y))./sum(Gamma(:,k));endPi=(sum(Gamma)/N)';[~,Class]=max(Gamma,[],2);% 计算均方根误差R_Mu=sum((LMu-Mu).^2,'all');R_Sigma=sum((LSigma-Sigma).^2,'all');R_Pi=sum((LPi-Pi).^2,'all');R=sqrt((R_Mu+R_Sigma+R_Pi)/(K*D+D*D*K+K));% 每隔10轮输出当前收敛情况turn=turn+1;if mod(turn,10)==0disp(' ')disp('==================================')disp(['第',num2str(turn),'次EM算法参数估计完成'])disp('----------------------------------')disp(['均方根误差:',num2str(R)])disp('当前各类中心点:')disp(Mu)end% 循环跳出if (R<1e-6)||isnan(R)disp(['第',num2str(turn),'次EM算法参数估计完成'])if turn>=1e4||isnan(R)disp('GMM模型不收敛')elsedisp(['GMM模型收敛,参数均方根误差为',num2str(R)])endbreak;end   LMu=Mu;LSigma=Sigma;LPi=Pi;
end
end

1.2 概率密度函数获取

就是一个比较复杂的函数获取(公式显示不全可左右滑动):

首先是高斯分布的函数:

N(x∣μ,Σ)=1(2π)D/21∣Σ∣1/2exp⁡[−12(x−μ)TΣ−1(x−μ)]\mathcal{N}(\boldsymbol{x} \mid \boldsymbol{\mu}, \boldsymbol{\Sigma})=\frac{1}{(2 \pi)^{D / 2}} \frac{1}{|\boldsymbol{\Sigma}|^{1 / 2}} \exp \left[-\frac{1}{2}(\boldsymbol{x}-\boldsymbol{\mu})^{T} \boldsymbol{\Sigma}^{-1}(\boldsymbol{x}-\boldsymbol{\mu})\right] N(x∣μ,Σ)=(2π)D/21​∣Σ∣1/21​exp[−21​(x−μ)TΣ−1(x−μ)]

那么高斯混合分布的函数就是好几个上面的高斯分布函数乘以系数再相加:
p(x)=∑k=1KπkN(x∣μk,Σk)p(\boldsymbol{x})=\sum_{k=1}^{K} \pi_{k} \mathcal{N}\left(\boldsymbol{x} \mid \boldsymbol{\mu}_{k}, \boldsymbol{\Sigma}_{k}\right) p(x)=k=1∑K​πk​N(x∣μk​,Σk​)

function func=getGaussFunc(Mu,Sigma,Pi)
[K,D]=size(Mu);X{D}=[];
for d=1:DX{d}=['x',num2str(d)];
end
X=sym(X);func=0;
for k=1:KtMu=Mu(k,:);tSigma=Sigma(:,:,k);   tPi=Pi(k);tX=X-tMu;   func=func+tPi*(1/(2*pi)^(D/2))*(1/det(tSigma)^(1/2))*exp((-1/2)*(tX/tSigma*tX.'));
endfunc=matlabFunction(func);
end

1.3 置信椭圆获取

function [X,Y]=getEllipse(Mu,Sigma,S,pntNum)
% 置信区间 | 95%:5.991  99%:9.21  90%:4.605
% (X-Mu)*inv(Sigma)*(X-Mu)=SinvSig=inv(Sigma);[V,D]=eig(invSig);
aa=sqrt(S/D(1));
bb=sqrt(S/D(4));t=linspace(0,2*pi,pntNum);
XY=V*[aa*cos(t);bb*sin(t)];
X=(XY(1,:)+Mu(1))';
Y=(XY(2,:)+Mu(2))';
end

2 聚类区域及边界绘制

2.1 数据及混合模型

以下是随机生成的一组数据,对其进行一次高斯混合分布聚类:

% 构造三个符合高斯分布的点集并合并
PntSet1=mvnrnd([2 3],[1 0;0 2],500);
PntSet2=mvnrnd([6 7],[1 0;0 2],500);
PntSet3=mvnrnd([6 2],[1 0;0 1],500);
X=[PntSet1;PntSet2;PntSet3];% 分类数量
K=3;% 构造GMM模型
tic
[Mu,Sigma,Pi,Class]=gaussKMeans(X,K,'dis');
toc

看一下分类结果:

% 配色
colorList=[0.4  0.76 0.650.99 0.55 0.38 0.55 0.63 0.800.23 0.49 0.710.95 0.57 0.470.94 0.65 0.120.70 0.26 0.420.86 0.82 0.11];
% -------------------------------------------------------------------------
% 绘制聚类情况
figure()
hold on
strSet{K}='';
for i=1:Kscatter(X(Class==i,1),X(Class==i,2),80,'filled',...'LineWidth',1,'MarkerEdgeColor',[1 1 1]*.3,'MarkerFaceColor',colorList(i,:));strSet{i}=['pointSet',num2str(i)];
end
legend(gca,strSet{:})
% 坐标区域修饰
ax=gca;
ax.LineWidth=1.4;
ax.Box='on';
ax.TickDir='in';
ax.XMinorTick='on';
ax.YMinorTick='on';
ax.XGrid='on';
ax.YGrid='on';
ax.GridLineStyle='--';
ax.XColor=[.3,.3,.3];
ax.YColor=[.3,.3,.3];
ax.FontWeight='bold';
ax.FontName='Cambria';
ax.FontSize=13;

2.2 聚类区域绘制

这里提供俩方法哈,不过不过不管咋样两个方法的思路都是先把坐标区域细分成网格,计算每个格点属于哪个类:

细分网格并计算格点归属

% 构造细密网格
x1=min(X(:,1)):0.01:max(X(:,1));
x2=min(X(:,2)):0.01:max(X(:,2));
[x1G,x2G]=meshgrid(x1,x2);
XGrid=[x1G(:),x2G(:)];% 检测每个格点属于哪一类
XV=zeros(size(XGrid,1),K);
for i=1:Ktf=getGaussFunc(Mu(i,:),Sigma(:,:,i),Pi(i));XV(:,i)=tf(x1G(:),x2G(:));
end
[~,idx2Region]=max(XV,[],2);

方法一:
假如安装了Statistics and Machine Learning Toolbox工具箱可以直接用gscatter函数:

% 绘制聚类区域方法一
gscatter(XGrid(:,1),XGrid(:,2),idx2Region,colorList,'..');

方法二:
假如没安装以上工具箱,可以使用surf函数绘制:

% 绘制聚类区域方法二
RGrid=zeros(size(x1G(:)));
GGrid=zeros(size(x1G(:)));
BGrid=zeros(size(x1G(:)));
for i=1:KRGrid(idx2Region==i)=colorList(i,1);GGrid(idx2Region==i)=colorList(i,2);BGrid(idx2Region==i)=colorList(i,3);
end
CGrid=[];
CGrid(:,:,1)=reshape(RGrid,size(x1G));
CGrid(:,:,2)=reshape(GGrid,size(x1G));
CGrid(:,:,3)=reshape(BGrid,size(x1G));
surf(x1G,x2G,zeros(size(x1G)),'CData',CGrid,'EdgeColor','none')

当然可以设置FaceAlpha为0.5将其变成半透明:

2.3 聚类边界绘制

没找到啥更好的方法,通过绘制等高线的方式绘制:

% 绘制边缘线
contour(x1G,x2G,reshape(idx2Region,size(x1G)),1.5:1:K,...'LineWidth',1.5,'LineColor',[0,0,0],'LineStyle','--')

如果格点取得越密集则越精细,格点取得不太精细的话绘图放的非常大是这样:

2.4 修饰

稍微修饰一下:

% -------------------------------------------------------------------------
% 绘制聚类区域及边界
figure()
hold on
% 构造细密网格
x1=min(X(:,1)):0.01:max(X(:,1));
x2=min(X(:,2)):0.01:max(X(:,2));
[x1G,x2G]=meshgrid(x1,x2);
XGrid=[x1G(:),x2G(:)];% 检测每个格点属于哪一类
XV=zeros(size(XGrid,1),K);
for i=1:Ktf=getGaussFunc(Mu(i,:),Sigma(:,:,i),Pi(i));XV(:,i)=tf(x1G(:),x2G(:));
end
[~,idx2Region]=max(XV,[],2);% 绘制聚类区域方法一
% gscatter(XGrid(:,1),XGrid(:,2),idx2Region,colorList,'..');% 绘制聚类区域方法二
RGrid=zeros(size(x1G(:)));
GGrid=zeros(size(x1G(:)));
BGrid=zeros(size(x1G(:)));
for i=1:KRGrid(idx2Region==i)=colorList(i,1);GGrid(idx2Region==i)=colorList(i,2);BGrid(idx2Region==i)=colorList(i,3);
end
CGrid=[];
CGrid(:,:,1)=reshape(RGrid,size(x1G));
CGrid(:,:,2)=reshape(GGrid,size(x1G));
CGrid(:,:,3)=reshape(BGrid,size(x1G));
surf(x1G,x2G,zeros(size(x1G)),'CData',CGrid,'EdgeColor','none','FaceAlpha',.5)% 绘制边缘线
contour(x1G,x2G,reshape(idx2Region,size(x1G)),1.5:1:K,...'LineWidth',1.5,'LineColor',[0,0,0],'LineStyle','--')scatterSet=[];
strSet{K}='';
for i=1:KscatterSet(i)=scatter(Mu(i,1),Mu(i,2),80,'filled','o','MarkerFaceColor',...colorList(i,:),'MarkerEdgeColor',[0,0,0],'LineWidth',1,'LineWidth',1.9);strSet{i}=['Cluster center ',num2str(i)];
end
% 添加图例
legend(scatterSet,strSet{:})
% 坐标区域修饰
ax=gca;
ax.LineWidth=1.4;
ax.Box='on';
ax.TickDir='in';
ax.XMinorTick='on';
ax.YMinorTick='on';
ax.XGrid='on';
ax.YGrid='on';
ax.GridLineStyle='--';
ax.XColor=[.3,.3,.3];
ax.YColor=[.3,.3,.3];
ax.FontWeight='bold';
ax.FontName='Cambria';
ax.FontSize=13;


3 完整代码

% 构造三个符合高斯分布的点集并合并
PntSet1=mvnrnd([2 3],[1 0;0 2],500);
PntSet2=mvnrnd([6 7],[1 0;0 2],500);
PntSet3=mvnrnd([6 2],[1 0;0 1],500);
X=[PntSet1;PntSet2;PntSet3];% 分类数量
K=3;% 构造GMM模型
tic
[Mu,Sigma,Pi,Class]=gaussKMeans(X,K,'dis');
toc% 配色
colorList=[0.4  0.76 0.650.99 0.55 0.38 0.55 0.63 0.800.23 0.49 0.710.95 0.57 0.470.94 0.65 0.120.70 0.26 0.420.86 0.82 0.11];% -------------------------------------------------------------------------
% 绘制聚类情况
figure()
hold on
strSet{K}='';
for i=1:Kscatter(X(Class==i,1),X(Class==i,2),80,'filled',...'LineWidth',1,'MarkerEdgeColor',[1 1 1]*.3,'MarkerFaceColor',colorList(i,:));strSet{i}=['pointSet',num2str(i)];
end
legend(gca,strSet{:})
% 坐标区域修饰
ax=gca;
ax.LineWidth=1.4;
ax.Box='on';
ax.TickDir='in';
ax.XMinorTick='on';
ax.YMinorTick='on';
ax.XGrid='on';
ax.YGrid='on';
ax.GridLineStyle='--';
ax.XColor=[.3,.3,.3];
ax.YColor=[.3,.3,.3];
ax.FontWeight='bold';
ax.FontName='Cambria';
ax.FontSize=13;% -------------------------------------------------------------------------
% 绘制聚类区域及边界
figure()
hold on
% 构造细密网格
x1=min(X(:,1)):0.01:max(X(:,1));
x2=min(X(:,2)):0.01:max(X(:,2));
[x1G,x2G]=meshgrid(x1,x2);
XGrid=[x1G(:),x2G(:)];% 检测每个格点属于哪一类
XV=zeros(size(XGrid,1),K);
for i=1:Ktf=getGaussFunc(Mu(i,:),Sigma(:,:,i),Pi(i));XV(:,i)=tf(x1G(:),x2G(:));
end
[~,idx2Region]=max(XV,[],2);% 绘制聚类区域方法一
% gscatter(XGrid(:,1),XGrid(:,2),idx2Region,colorList,'..');% 绘制聚类区域方法二
RGrid=zeros(size(x1G(:)));
GGrid=zeros(size(x1G(:)));
BGrid=zeros(size(x1G(:)));
for i=1:KRGrid(idx2Region==i)=colorList(i,1);GGrid(idx2Region==i)=colorList(i,2);BGrid(idx2Region==i)=colorList(i,3);
end
CGrid=[];
CGrid(:,:,1)=reshape(RGrid,size(x1G));
CGrid(:,:,2)=reshape(GGrid,size(x1G));
CGrid(:,:,3)=reshape(BGrid,size(x1G));
surf(x1G,x2G,zeros(size(x1G)),'CData',CGrid,'EdgeColor','none','FaceAlpha',.5)% 绘制边缘线
contour(x1G,x2G,reshape(idx2Region,size(x1G)),1.5:1:K,...'LineWidth',1.5,'LineColor',[0,0,0],'LineStyle','--')scatterSet=[];
strSet{K}='';
for i=1:KscatterSet(i)=scatter(Mu(i,1),Mu(i,2),80,'filled','o','MarkerFaceColor',...colorList(i,:),'MarkerEdgeColor',[0,0,0],'LineWidth',1,'LineWidth',1.9);strSet{i}=['Cluster center ',num2str(i)];
end
% 添加图例
legend(scatterSet,strSet{:})
% 坐标区域修饰
ax=gca;
ax.LineWidth=1.4;
ax.Box='on';
ax.TickDir='in';
ax.XMinorTick='on';
ax.YMinorTick='on';
ax.XGrid='on';
ax.YGrid='on';
ax.GridLineStyle='--';
ax.XColor=[.3,.3,.3];
ax.YColor=[.3,.3,.3];
ax.FontWeight='bold';
ax.FontName='Cambria';
ax.FontSize=13;

再比如将K聚类簇数量改为4:


需要把全部工具函数放在一个文件夹,若是不会组装,可直接从以下链接获取文件:
链接:https://pan.baidu.com/s/18pcYK1HKgQ49Qj1uGEdG-A?pwd=slan
提取码:slan

MATLAB | 如何绘制高斯混合分布分类区域及边界相关推荐

  1. 基于matlab的图像形状与分类毕业设计(含源文)

    基于matlab的图像形状与分类 摘 要 数字图像处理是一门新兴技术,随着计算机硬件的发展,数字图像的实时处理已经成为可能,由于数字图像处理的各种算法的出现,使得其处理速度越来越快,能更好的为人们服务 ...

  2. matlab对直方图分类,matlab根据直方图进行图片分类

    matlab根据直方图进行图片分类 matlab根据直方图进行图片分类 感觉还有一些bug需要调试,不过还是先写出来吧 将一张图片由rgb转hsv空间,并进行量化 function [Hh,Vv,Ss ...

  3. MATLAB数字图像处理系统-形状分类

    MATLAB数字图像处理系统-形状分类 摘 要 数字图像处理是一门新兴技术,随着计算机硬件的发展,数字图像的实时处理已经成为可能,由于数字图像处理的各种算法的出现,使得其处理速度越来越快,能更好的为人 ...

  4. Matlab图形绘制经典案例 (2)

    24.绘制函数的梯度场矢量图. >> [x,y]=meshgrid([-2:0.1:2]); %建立栅格点数据向量 >> z=3.*x.*y*exp(-x.^2-y.^2)-1 ...

  5. matlab图形绘制经典案例,MATLAB经典教程第四章_图形绘制.ppt

    <MATLAB经典教程第四章_图形绘制.ppt>由会员分享,可在线阅读,更多相关<MATLAB经典教程第四章_图形绘制.ppt(32页珍藏版)>请在人人文库网上搜索. 1.Ma ...

  6. MATLAB轻松绘制地图路线——已知及未知坐标下的处理方法(1)

    文章目录 已知坐标的情况 未知坐标的情况 完整工程文件下载链接: 要想绘制地图路线, 最基本的要素就是 各点的坐标,有了坐标,还要知道哪个点和哪个点相连,最后将各点相连即可: 但有时候我们有的往往只是 ...

  7. matlab 图形绘制,MatLab图形绘制功能

    MatLab图形绘制功能 MatLab % 0到10的1000个点的x座标 y=sin(x); % 对应的y座标 plot(x,y); % 绘图 Y=sin(10*x); plot(x,y, r: , ...

  8. matlab绘制抛物线,MATLAB中绘制抛物线的图像,请补充完成下面代码: clc,clear; x=linspace(...

    MATLAB中绘制抛物线的图像,请补充完成下面代码: clc,clear; x=linspace(-2,2,100); ____________; plot(x,y) 答: y=x.^2 在下列各项中 ...

  9. 两个同时comet matlab,matlab 三维绘制

    1. mesh(Z)语句 mesh(Z)语句可以给出矩阵Z元素的三维消隐图,网络表面由Z坐标点定义,与前面叙述的x-y平面的线格相同,图形由邻近的点连接而成.它可用来显示用其它方式难以输出的包含大量数 ...

最新文章

  1. 苹果A15能征服原神?我劝你还不如买个散热背夹
  2. C指针原理(26)-gtk
  3. Asp.net中服务端控件事件是如何触发的(笔记)
  4. SAP 产品一脉相承的 UI 增强思路,在 SAP Commerce Cloud(电商云) UI 增强实现中的体现
  5. 2021年恩阳中学高考成绩查询,巴中市恩阳中学2021年排名
  6. 【渝粤教育】广东开放大学 网页设计与制作 形成性考核 (25)
  7. 7-1 两个有序链表序列的合并 (15 分)
  8. springboot学习过程中遇到的错误集
  9. linux 循环小时,shell脚本日期遍历(按天按小时)
  10. java 获取mac地址_java入门知识点和环境准备
  11. camel研究_【卡瑞利珠单抗·CameL研究者说】任秀宝教授:卡瑞利珠单抗治疗NSCLC疗效与安全性俱佳,受指南重磅推荐后再获批肺癌适应症...
  12. 英文论文检索数据库以及英文文献下载
  13. android空间深度清理,安卓手机垃圾深度清理技巧
  14. Java实现LDAP认证(上)
  15. 视频安防“上帝视角“的畅想
  16. 点石互动--kyw之:Google优化圣经翻译
  17. HTML转义字符、Javascript转义字符、HTML特殊字符对照表
  18. 京东亿级商品搜索核心技术解密
  19. java微博开发_利用java语言在eclipse下实现在新浪微博开发平台发微博(转)
  20. 每周汇报 - 树叶的图像分类

热门文章

  1. HTML+CSS作品展示(仿写携程网移动端首页①)
  2. NX二次开发 UFUN遍历所有对象 UF_OBJ_cycle_all
  3. pytorch学习教程笔记(一)
  4. CEF资源无法下载(https://cef-builds.spotifycdn.com)
  5. JavaScript实现的水果忍者游戏,支持鼠标操作 1
  6. Unity3d场景切换
  7. 【科普】WebSocket
  8. 苹果电脑删除下载的更新文件_软件更新,无需手动下载更新文件。不再依赖QQ浏览器。...
  9. android系统锁屏锁怎么解决方法,Android 屏幕锁 - WakeLock
  10. echarts 怎么获取乡镇街道json