代码采用鸢尾花数据集的第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 版权协议,转载请附上原文出处链接和本声明。