k-means方法解决二类聚类问题的matlab实现

  • Post author:
  • Post category:其他


代码采用鸢尾花数据集的第3,4个属性的数据,实现基于k-means方法的聚类(类别数k=2)

这里的初始类别中心是随机生成的,此步骤可优化,详见https://www.cnblogs.com/dudumiaomiao/p/5839905.html

load fisheriris
 x=meas;%读取鸢尾花数据集
 x1=x(:,3);
 x2=x(:,4);
 scatter(x1,x2);%从散点图可以看出明显地分为两类
 minx=min(x1);
 miny=min(x2);
 maxx=max(x1);
 maxy=max(x2);
 k1=[minx+(maxx-minx)*rand(),miny+(maxy-miny)*rand()];
 k2=[minx+(maxx-minx)*rand(),miny+(maxy-miny)*rand()];%初始化聚类中心点
 
 delta=10;
 c=1;%迭代次数
 while delta>0
     class1=[];
     class2=[];
     for i=1:length(x)
         if norm(x(i,:)-k1(c,:))<norm(x(i,:)-k2(c,:))%判断样本与每个聚类中心点的距离
             labelx(i,1)=1;%记录样本的类别
             class1=[class1;x(i,:)];
         else
             labelx(i,1)=2;
             class2=[class2;x(i,:)];
         end
     end
     
     k1=[k1;mean(class1(:,1)),mean(class1(:,2))];
     k2=[k2;mean(class2(:,1)),mean(class2(:,2))];%记录每代的聚类中心点
     
     delta=sum(abs(k1(c,:)-k1(c+1,:))+abs(k2(c,:)-k2(c+1,:)));%如果不再变化则输出聚类中心点
     c=c+1;
 end
 
 scatter(class1(:,1),class1(:,2),'r');
 hold on
 scatter(class2(:,1),class2(:,2),'b');
 
 disp('聚类中心1:')
 k1(c,:)
 disp('聚类中心2:')
 k2(c,:)

初始样本分布情况如下,很明显分为两类:

在这里插入图片描述

某次实验中经过6次迭代后收敛,聚类结果如下:

在这里插入图片描述



版权声明:本文为weixin_43244928原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。