% K-means聚类分析
clear all;
close all;
clc;
%%
data=gallery('uniformdata',[400 2],500).*500;
N=7;%设置聚类数目
[m,n]=size(data);%表示矩阵data大小,m行n列
pattern=zeros(m,n+1);%生成0矩阵
center=zeros(N,n);%初始化聚类中心
pattern(:,1:n)=data(:,:);
r_tongxing=50;
%!!随机数可能存在相同的情况,应该在这里补充意外情况;
for x=1:N
center(x,:)=data( randi(m,1),:);%第一次随机产生聚类中心,
end
% 这里采用优化初始聚类中心来,筛选第一次的聚类中心位置以及数量;
midu=zeros(m,1);
tempr=0;
for i=1:m
for j=1:m
if(i~=j)
tempr=norm(data(i,:)-data(j,:))<r_tongxing;
midu(i,1)=midu(i,1)+tempr;
end
end
end
while 1 %循环迭代每次的聚类簇;
distence=zeros(1,N);%最小距离矩阵
num=zeros(1,N);%聚类簇数矩阵
new_center=zeros(N,n);%聚类中心矩阵
for x=1:m
for y=1:N
distence(y)=norm(data(x,:)-center(y,:));%计算每个点到每个聚类中心的距离
end
[~, temp]=min(distence);%求最小的距离
pattern(x,n+1)=temp;%划分所有对象点到最近的聚类中心;标记为1,2,3;
end
%!!!!!!!!!!应为可能存在聚类簇就一个点,num(y)可能等于0,这里需要改一下;
k=0;
for y=1:N
for x=1:m
if pattern(x,n+1)==y
new_center(y,:)=new_center(y,:)+pattern(x,1:n);
num(y)=num(y)+1;
end
end
if(num(y)>=1)%如果聚类中心,没有点距离这个中心最近,那么聚类中心则不更新。
new_center(y,:)=new_center(y,:)/num(y);%求均值,即新的聚类中心;
if norm(new_center(y,:)-center(y,:))<0.01%检查集群中心是否已收敛。如果是则终止。
k=k+1;
end
else
new_center(y,:)=center(y,:);
end
end
if k==N
break;
else
center=new_center;
end
end
[m, n]=size(pattern);
%最后显示聚类后的数据
figure;
hold on;
% plot(pattern(:,1),pattern(:,2),'b.','markersize',14);
sizemarker=5;
for i=1:m
if rem(pattern(i,n),7)==0
plot(pattern(i,1),pattern(i,2),'c.','markersize',sizemarker);
end
if rem(pattern(i,n),7)==1
plot(pattern(i,1),pattern(i,2),'b.','markersize',sizemarker);
end
if rem(pattern(i,n),7)==2
plot(pattern(i,1),pattern(i,2),'c.','markersize',sizemarker);
end
if rem(pattern(i,n),7)==3
plot(pattern(i,1),pattern(i,2),'r.','markersize',sizemarker);
end
if rem(pattern(i,n),7)==4
plot(pattern(i,1),pattern(i,2),'g.','markersize',sizemarker);
end
if rem(pattern(i,n),7)==5
plot(pattern(i,1),pattern(i,2),'m.','markersize',sizemarker);
end
if rem(pattern(i,n),7)==6
plot(pattern(i,1),pattern(i,2),'k.','markersize',sizemarker);
end
end
plot(center(:,1),center(:,2),'r.','markersize',36);
plot(250,250,'k.','markersize',80);
voronoi(center(:,1),center(:,2))
grid on;
K-means聚类分析
最新推荐文章于 2022-07-03 21:24:01 发布