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

代码采用鸢尾花数据集的第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次迭代后收敛,聚类结果如下:
在这里插入图片描述

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值