Matlab实现K均值聚类
%根据c均值法进行聚类分析
%C 均值法原理
%该方法取定 C 个类别和选取 C 个初始聚类中心,按最小距离原则将各模式分配到 C类中的某一类,
%然后不断地计算类心和调整各模式的类别,最终使各模式到其判属类别中心的距离平方之和最小。
clear;clc;
a=[1,0,0
2,1,0
3,0,1
4,1,1
5,2,1
6,1,2
7,2,2
8,3,2
9,6,6
10,7,6
11,8,6
12,6,7
13,7,7
14,8,7
15,9,7
16,7,8
17,8,8
18,9,8
19,8,9
20,9,9];
s=0.000001;
[m,n]=size(a);
center1=a(1,2:3); % 初始的第一类及第 2 类类中心
center2=a(2,2:3);
x=0;
while 1
set1=[]; set2=[]; %第 1,2 类的集合
%%第 2 步:计算所有点到两个类中心的距离,并把此点放入距离最近的那一类
for i=1:m
d1=(a(i,2)-center1(1))^2+(a(i,3)-center1(2))^2;
d2=(a(i,2)-center2(1))^2+(a(i,3)-center2(2))^2;
if d1<d2
set1=[set1;a(i,:)];
else
set2=[set2;a(i,:)];
end
end
center3=mean(set1(:,2:3)); %根据新分成的两类建立新的聚类中心
center4=mean(set2(:,2:3));
D1=sqrt((center1(1)-center3(1))^2+(center1(2)-center3(2))^2);%新建成聚类中心和原来聚类中心距离
D2=sqrt((center2(1)-center4(1))^2+(center2(2)-center4(2))^2);
if (D1<s)&&(D2<s) %判断新聚类中心和原来聚类中心是否相等
break
end
center1=center3; %更新类中心
center2=center4;
x=x+1; %判断循环次数
end
fprintf('循环次数为 %d\n',x);
plot(set1(:,2),set1(:,3),'*','Color','red');%画出图像
hold on;
plot(set2(:,2),set2(:,3),'*','Color','blue');
pos=axis; %pos=[xmin,xmax,ymin,ymax]
xlabel('x1','Position',[1.03*pos(2) 0.4+pos(3)]), ylabel('x2');
ylabel('x2','Position',[0.2+pos(1) 0.4+pos(4)]), ylabel('x2');
小白练手,敬请斧正。