• 无公害@
    了解作者
  • matlab
    开发工具
  • 2KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 1
    下载次数
  • 2021-04-01 11:41
    上传日期
K-means聚类算法,实现对数据集的分类。
1.rar
  • 1
  • K_means.m
    2.8KB
  • FunK_mean.m
    2.5KB
内容介绍
clear all clc close all figure(1); set(gcf,'Position',[500,100,800,600], 'color','w'); %以下使用mvnrnd函数指定均值和协方差,产生指定大小的数据集 M1=[0 0 0]; S1=[.2 0 0;0 .2 0;0 0 .2]; data2=mvnrnd(M1,S1,200); M2=[1.2 1.5 1]; S2=[.6 0 0;0 .6 0;0 0 .6]; data3=mvnrnd(M2,S1,200); M3=[-1.3 1.2 -2]; S3=[1.8 0 0;0 1.8 0;0 0 1.8]; data1=mvnrnd(M3,S1,200); plot3(data1(:,1),data1(:,2),data1(:,3),'b+'); hold on; plot3(data2(:,1),data2(:,2),data2(:,3),'r*'); plot3(data3(:,1),data3(:,2),data3(:,3),'gp'); title('初始状态'); grid on pause(3); figure(2) set(gcf,'Position',[500,100,800,600], 'color','w'); num=[];%用于存放属于各类的样本数量 new_center=[];%用于存放更新的聚类中心坐标 Data=[data1;data2;data3]; NC=3;%设置聚类的中心数 [m n]=size(Data); pattern=zeros(m,n+1); center=zeros(NC,n); pattern(:,1:n)=Data(:,:); for x=1:NC center(x,:)=Data(randi(300,1),:);%范围imin--imax...r = randi(imax,n):生成n*n的矩阵;r = randi(imax,m,n):生成m*n的矩阵 end while 1 distance=zeros(1,NC); num=zeros(1,NC); new_center=zeros(NC,n); for x=1:m for y=1:NC distance(y)=norm(Data(x,:)-center(y,:));%计算样本到聚类中心之间的距离 end [~,label]=min(distance); pattern(x,n+1)=label;%增加一个类别标签label end k=0; for y=1:NC 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;%统计属于y类的样本数量 end end new_center(y,:)=new_center(y,:)/num(y); if norm(new_center(y,:)-center(y,:))<0.001 k=k+1; end end if k==NC break; else center=new_center; end title('聚类过程'); grid on; for i=1:m if pattern(i,n+1)==1 plot3(pattern(i,1),pattern(i,2),pattern(i,3),'r*'); elseif pattern(i,n+1)==2 plot3(pattern(i,1),pattern(i,2),pattern(i,3),'g*'); else plot3(pattern(i,1),pattern(i,2),pattern(i,3),'b*'); end end hold on; pause(0.5); end figure(3); title('最终结果'); set(gcf,'Position',[500,100,800,600], 'color','w'); hold on; for i=1:NC plot3(center(i,1),center(i,2),center(i,3),'ko'); if i==1 text(center(i,1),center(i,2),'Cluster 1'); elseif i==2 text(center(i,1),center(i,2),'Cluster 2'); elseif i==3 text(center(i,1),center(i,2),'Cluster 3'); end end for i=1:m if pattern(i,n+1)==1 plot3(pattern(i,1),pattern(i,2),pattern(i,3),'r*'); elseif pattern(i,n+1)==2 plot3(pattern(i,1),pattern(i,2),pattern(i,3),'g*'); else plot3(pattern(i,1),pattern(i,2),pattern(i,3),'b*'); end end grid on; pause(2);
评论
    相关推荐