Matlab实现聚类算法的步骤与技巧

load simulate2020625;

k=max(subcluster(:,3));%设置聚类数目
data = subcluster(:,1:2);
cata = subcluster;
[m,n]=size(data);
c1=subcluster(:,3);
c1=c1';


%% 实际聚类图
figure(1);
plot(cata(cata(:,3)==1,1),cata(cata(:,3)==1,2),'r*')
hold on
plot(cata(cata(:,3)==2,1),cata(cata(:,3)==2,2),'b*')
hold on
plot(cata(cata(:,3)==3,1),cata(cata(:,3)==3,2),'g*')
hold on
plot(cata(cata(:,3)==4,1),cata(cata(:,3)==4,2),'y*')
title('实际聚类图')
grid on;

%%
pattern=zeros(m,n+1);
center=zeros(k,n);%初始化聚类中心
pattern(:,1:n)=data(:,:);

%% 找到空间中距离最远两点
U = zeros(k,n);
temp = pdist(data);
temp = squareform(temp);         %%转化成两两距离矩阵。
[~,t1] = max(temp);
[~,t2] = max(max(temp));
row = t1(t2);
col = t2;
%行,列分别对应一个节点。
U(1,:) = data(row,:);
U(2,:) = data(col,:);


%% 选择U集合,得初始聚类中心
record = data;
record([row col],:) = [];
N = 2;

if k>2
   while N~=k
       x = 0;
       y = 0;
       rlength = size(record,1);
       ulength = size(U,1);
       point_to_centre_distance = 0;
       temp_u = zeros(ulength,1);
       for i = 1:rlength
           for j = 1:ulength
               temp_u(j) = norm(U(j,:)-record(i,:));
           end
           min_value = min(temp_u);
           if point_to_centre_distance < min_value
               point_to_centre_distance = min_value;
               x = i; % 记录
           end
       end
       for i = 1:m
           if (record(x,:) == data(i,:))
               y = i;
               break
           end
       end
       U(N+1,:) = data(y,:); % 所找到的中心点加入集合
       record(x, :) = []; % 所找到的中心点排除集合
       N  = N + 1;
   end
end

%% k-means
for x=1:N
   center(x,:)=U(x,:);
end
count = 1;
while true
   new_center=zeros(N,n); %临时各类坐标
   distence = zeros(1,N);
   for x=1:m
       for y=1:N
           distence(y)=norm(data(x,:)-center(y,:));
       end
       [~, col]=min(distence);%求最小的距离
       pattern(x,3)=col;
   end
   
   temp = [];
   for t = 1:N
       temp = pattern(find(pattern(:,n+1)==t),1:n);
       ssum = zeros(1,size(temp,1));
       for i = 1:size(temp,1)
           for j = 1:size(temp,1)
               ssum(i) = ssum(i)+norm(temp(i,:)-temp(j,:));
           end
       end
       [~,col] = min(ssum);
       new_center(t,:) = temp(col,:);
       
   end
   k=0;%初始条件
       for y = 1:N
       if norm(new_center(y,:)-center(y,:))<1e-1 %结束条件之一
          k=k+1;
       end
   end
   if k==N
        break;
   else
       center=new_center; %更新聚类中心
   end
end
   
%评价指标:
index=pattern(:,3);
index=index';
[AR,RI,MI,HI]=RandIndex(c1,index)
NMI=nmi(c1,index)
% AR =
%     0.9670
% RI =
%     0.9876
% MI =
%     0.0124
% HI =
%     0.9753
% NMI =
%     0.9483
disp('---------------------------------')
%绘图
figure(2)
plot(data(index==1,1),data(index==1,2),'r*')
hold on
plot(data(index==2,1),data(index==2,2),'b*')
hold on
plot(data(index==3,1),data(index==3,2),'g*')
hold on
plot(data(index==4,1),data(index==4,2),'y*')
title('自编写Kmeans算法图')

%% 系统自带的kmeans聚类算法
[Idx,C,sumD,D]=kmeans(data,k);
Idx=Idx';
%评价指标
[AR,RI,MI,HI]=RandIndex(c1,Idx)
NMI=nmi(c1,Idx)
%绘图
figure(3)
plot(data(Idx==1,1),data(Idx==1,2),'r*')
hold on
plot(data(Idx==2,1),data(Idx==2,2),'b*')
hold on
plot(data(Idx==3,1),data(Idx==3,2),'g*')
hold on
plot(data(Idx==4,1),data(Idx==4,2),'y*')
title('matlab自带Kmeans算法图')

在这里插入图片描述


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空