本篇文章主要解决对于kmeans聚类结果,怎样绘制更强的聚类边界:

不过在此之前先讲解如何绘制聚类效果、聚类边界,最后再展示上图所示更强的聚类边界。代码其实不需要写下面那么长,但是为了画图好看就写长点叭:


kmeans聚类结果

kmeans原理太简单就不细致的讲解了,而且matlab自带了kmeans函数,直接用就完事了,以下随机生成一组数据并聚类并绘图:

% kmeans demo
% rng(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];% kmeans聚类
K=3;
[idx,C]=kmeans(X,K);
% 配色
colorList=[0.4  0.76 0.650.99 0.55 0.38 0.55 0.63 0.800.23 0.49 0.710.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(idx==i,1),X(idx==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=11;


kmeans聚类边界

我们任取一个点,当然是离哪个聚类中心近那就属于哪个聚类区域,这样我们就可以在平面上取非常多的点来描述聚类区域与边界。

公式描述来看,分类数为KKK,k=1,2,…,Kk=1,2,\dots,Kk=1,2,…,K,聚类中心坐标写作CkC_kCk​,对于任意一点PPP,若:

k∗=arg⁡min⁡k∥P−Ck∥k^{*}=\underset{k}{\arg \min } \left \| P-C_k\right \| k∗=kargmin​∥P−Ck​∥
则该点属于第k∗k^{*}k∗类。

% kmeans Region demo
% rng(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];% kmeans聚类
K=3;
[idx,C]=kmeans(X,K);
% 配色
colorList=[0.4  0.76 0.650.99 0.55 0.38 0.55 0.63 0.800.23 0.49 0.710.94 0.65 0.120.70 0.26 0.420.86 0.82 0.11];
% 绘制聚类区域及边界 ========================================================
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:KXV(:,i)=sqrt(sum((XGrid-C(i,:)).^2,2));
end
[~,idx2Region]=min(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(C(i,1),C(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=11;


更复杂的边界

这里只是举个例子哈,大家当然可以整出更复杂的边界,首先假设:
k∗=arg⁡min⁡k∥P−Ck∥4k^{*}=\underset{k}{\arg \min } \left \| P-C_k\right \| ^4 k∗=kargmin​∥P−Ck​∥4

这是我在某篇论文中看到的边界条件,不过四次方在[0,+∞)\left [ 0,+\infty \right )[0,+∞) 上面单调,光改这一点并不会对图像产生任何影响,因此该条件的描述不止于,对于上面得到的k∗k^*k∗,若:

∥P−Ck∗∥4+γ<∥P−Ck∥4,k≠k∗\left \| P-C_{k^*}\right \| ^4+\gamma< \left \| P-C_k\right \| ^4\\ ,k\neq k^* ∥P−Ck∗​∥4+γ<∥P−Ck​∥4,k=k∗
则该PPP点属于第k∗k^*k∗类,否则就哪个类也不属于(或者说噪声类?),其实思想也很简单,就是我仅仅数值小不顶用,我还要小到一定程度才行。我加上一个数值还是更趋向于这个类,那就属于这个类没跑了。

% kmeans Region demo
rng(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];% kmeans聚类
K=3;
[idx,C]=kmeans(X,K);
% 配色
colorList=[0.4  0.76 0.650.99 0.55 0.38 0.55 0.63 0.800.23 0.49 0.710.94 0.65 0.120.70 0.26 0.420.86 0.82 0.11];% 绘制更强的边界 ===========================================================
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:KXV(:,i)=sum((XGrid-C(i,:)).^2,2).^2;
end % 绘制第二类区域及边界
gamma=[100,200,600,1500];
for g=1:4subplot(2,2,g)hold on[~,idx2Region2]=min(XV,[],2);Len=length(idx2Region2);minXV=XV(sub2ind(size(XV),(1:Len)',idx2Region2))+gamma(g);tXV=XV;tXV(sub2ind(size(XV),(1:Len)',idx2Region2))=inf;tBool=all((tXV-minXV)>0,2);idx2Region2(~tBool)=K+1;% 绘制聚类区域方法二RGrid=zeros(size(x1G(:)));GGrid=zeros(size(x1G(:)));BGrid=zeros(size(x1G(:)));for i=1:K+1RGrid(idx2Region2==i)=colorList(i,1);GGrid(idx2Region2==i)=colorList(i,2);BGrid(idx2Region2==i)=colorList(i,3);endCGrid=[];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(idx2Region2,size(x1G)),1.5:1:(K+1),...'LineWidth',1.5,'LineColor',[0,0,0],'LineStyle','--')scatterSet=[];strSet{K}='';for i=1:KscatterSet(i)=scatter(C(i,1),C(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=11;title(['\gamma=',num2str(gamma(g))],'FontWeight','bold')
end

MATLAB | kmeans聚类如何绘制更强的聚类边界(决策边界)相关推荐

  1. 【机器学习】逻辑回归案例二:鸢尾花数据分类,决策边界绘制逐步代码讲解

    逻辑回归案例二:鸢尾花数据分类,决策边界绘制逐步代码讲解 1 数据加载 2 数据EDA 3 模型创建及应用 3.1 数据切分 3.2 创建模型与分类 3.3 决策边界绘制 3.3.1 二分类决策边界绘 ...

  2. KMeans聚类并绘制聚类后的决策边界

    KMeans聚类并绘制聚类后的决策边界 # 导数基础包和函数 from sklearn import datasets import matplotlib.pyplot as plt # 使用skel ...

  3. 光谱分类算法 matlab,Matlab K-means聚类算法对多光谱遥感图像进行分类(一)

    Matlab K-means聚类算法对多光谱遥感图像进行分类 作者: 白艺亭 测试了下matlab自带kmeans函数,作者编写函数,以及ENVI下的Kmeans方法,对比其效果,代码及结果图展示见下 ...

  4. 两种聚类方法——K均值聚类(K-means)算法和模糊C均值聚类(FCM)算法的简述与在MATLAB中的实现

    目录 1.K-means算法 1.1算法流程 1.2程序实现 1.3实验结果 原始数据集 聚类结果 2.FCM算法 2.1算法流程 2.2程序设计 FCM子函数 主函数 2.3实验结果 原始数据集 聚 ...

  5. 目标检测经典论文——YOLOv2论文翻译(纯中文版):YOLO9000:更好、更快、更强

    目标检测经典论文翻译汇总:[翻译汇总] 翻译pdf文件下载:[下载地址] 此版为纯中文版,中英文对照版请稳步:[YOLOv2中英文对照版] YOLO9000:更好.更快.更强 Joseph Redmo ...

  6. matlab一般函数的绘制方法,基于MATLAB的函数图像绘制方法

    C DOI:10.16707~.cnki.fjpc.2017.01.084 E 晒 亍嚣 基于 MATLAB的函数图像绘制方法 张笑笑 一,童 键 z (1湖南省长沙市第一中学 湖南 长沙 410() ...

  7. fft的c语言和matlab对比_Matlab在绘制两相互垂直斜锯齿振动与简谐振动合成运动轨迹图形的应用...

    1 提出问题 在振动学中,相互垂直的两简谐振动合成时,如果两简谐振动的频率相同,则可形成稳定的椭圆曲线,极端条件为圆和直线:而当两相互垂直的简谐振动频率不同时,合成运动比较复杂,其运动轨迹一般不闭合, ...

  8. 目标检测经典论文——YOLOV2论文翻译:YOLO9000: Better, Faster, Stronger(YOLO9000:更好、更快、更强)

    YOLO9000: Better, Faster, Stronger YOLO9000:更好.更快.更强 Joseph Redmon*†, Ali Farhadi*† University of Wa ...

  9. 无监督学习 | KMeans之Sklearn实现:电影评分聚类

    文章目录 1. KMeans in Sklearn 2. Sklearn 实例:电影评分的 k 均值聚类 2.1 数据集概述 2.2 二维 KMeans 聚类 3. 肘部法选取最优 K 值 4. 多维 ...

最新文章

  1. 【C++11】30分钟了解C++11新特性
  2. Fourinone2.0对分布式文件的简化操作
  3. Eclipse 部分快捷键
  4. 程序员的自我反省-十条原则
  5. zookeeper的设计猜想-数据同步
  6. qt 实现 以图片为中心 让它旋转_QT图片旋转动画
  7. 我的专业我的梦作文计算机,我的创新我的梦作文
  8. Java学习 第三章 数组(一)一维数组
  9. 前端全栈大佬是如何使用javaScript实现一个无缝轮播
  10. 我们是否能信任算法?不信任又能怎么办?
  11. oracle ebs应用产品安全性-交叉验证规则
  12. Vue 中watch和computed 的用法及区别
  13. string和string.h以及cstring的区别
  14. su室内插件_sketchup模型库+SU组件+插件+风格库集+模型 建筑 室内 园林景观
  15. C# TextBox 自动换行问题解决
  16. (5)exec函数详解
  17. STM32H7 DAC2+BDMA
  18. 【opencv学习笔记】2用摄像头识别指定颜色
  19. Excel一行头尾置换
  20. 2D基本图形的Sign Distance Function (SDF)详解(上)

热门文章

  1. 【LVGL】设置对象样式 - 渐变背景色
  2. 怎么截取oracle的数据,oracle sql截取数据长度
  3. day5 list,for
  4. 关于移动版饥荒与电脑版饥荒的存档移植
  5. 黑格尔哲学讲义(二)
  6. idea2019 marketplace无法连接网络
  7. Java生成小程序二维码并带参数
  8. Java适配器模式详解和实际应用
  9. 【python 存储数据 h5py | h5df】【jupyter notebook 大型中间结果存储】
  10. SQLserver 外连接查询-左连接查询