聚类算法MATLAB实现

  • u7_259655
    了解作者
  • 11.8KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-05-18 09:32
    上传日期
包含了kmeans和kmedoids两种算法的MATLAB代码,每种算法都用多种方法实现了,且均采用了一维数据和二维数据
聚类算法.zip
  • 聚类算法
  • Kmediods1维.m
    1.9KB
  • kmedoids调用.m
    1.5KB
  • kmedoids.m
    1.7KB
  • Kmedoids2维.m
    3.2KB
  • Kmeans2维.m
    2.6KB
  • Kmedoids2维注释.m
    2.1KB
  • kmedoids2维(改进).m
    2.3KB
  • kmeans3维.m
    2.6KB
  • Kmeans1维.m
    1.5KB
  • kmeas2维(改进).m
    1.9KB
  • k中心点方法2.m
    1.3KB
  • k均值方法2.m
    1.3KB
内容介绍
close all; %清空环境变量 clear; clc; data1x=randn(100,1)+9*ones(100,1); %产生3组数据 data1y=randn(100,1)+13*ones(100,1); data2x=randn(100,1)+10*ones(100,1); data2y=randn(100,1)+10*ones(100,1); data3x=randn(100,1)+13*ones(100,1); data3y=randn(100,1)+12*ones(100,1); data=zeros(300,3); %将3组数据合成 data(:,1)=[data1x;data2x;data3x]; data(:,2)=[data1y;data2y;data3y]; n=length(data); figure; %显示数据 hold on; for i=1:n plot(data(i,1),data(i,2),'go'); end title('原始数据'); q=randint(1,3,[1 n]); %选择3个初始聚类中心 q=sort(q); center=zeros(3,2); center(1,:)=data(q(1),1:2); center(2,:)=data(q(2),1:2); center(3,:)=data(q(3),1:2); distance=zeros(n); %计算各点间距离矩阵 for i=1:n for j=1:n distance(i,j)=sqrt((data(i,1)-data(j,1))^2+(data(i,2)-data(j,2))^2); end end while 1 for i=1:n %确定聚类中心所在行 if data(i,1)==center(1,1) && data(i,2)==center(1,2) c1=i; end if data(i,1)==center(2,1) && data(i,2)==center(2,2) c2=i; end if data(i,1)==center(3,1) && data(i,2)==center(3,2) c3=i; end end for i=1:n %对所有点进行分类 if distance(c1,i)<distance(c2,i) && distance(c1,i)<distance(c3,i) %第一类 data(i,3)=1; end if distance(c2,i)<distance(c1,i) && distance(c2,i)<distance(c3,i) %第二类 data(i,3)=2; end if distance(c3,i)<distance(c1,i) && distance(c3,i)<distance(c2,i) %第三类 data(i,3)=3; end end %更新聚类中心 m1=find(data(:,3)==1); %第一类 smin=sum(distance(c1,m1)); flag1=1; %设置标志,用于判断该类的中心是否变动 for i=1:length(m1) s=sum(distance(m1(i),m1)); if s<smin smin=s; center(1,1)=data(m1(i),1); center(1,2)=data(m1(i),2); flag1=0; end end m2=find(data(:,3)==2); %第二类 smin=sum(distance(c2,m2)); flag2=1; %设置标志,用于判断该类的中心是否变动 for i=1:length(c2) s=sum(distance(m2(i),m2)); if s<smin smin=s; center(2,1)=data(m2(i),1); center(2,2)=data(m2(i),2); flag2=0; end end m3=find(data(:,3)==3); %第三类 smin=sum(distance(c3,m3)); flag3=1; %设置标志,用于判断该类的中心是否变动 for i=1:length(m3) s=sum(distance(m3(i),m3)); if s<smin smin=s; center(3,1)=data(m3(i),1); center(3,2)=data(m3(i),2); flag3=0; end end %判断是否满足要求 if flag1 && flag2 && flag3 %当3个聚类中心都不再变动时,迭代终止 C1=center(1,:); C2=center(2,:); C3=center(3,:); break; end end figure; %显示结果 hold on; for i=1:n if data(i,3)==1 plot(data(i,1),data(i,2),'go'); end if data(i,3)==2 plot(data(i,1),data(i,2),'yo'); end if data(i,3)==3 plot(data(i,1),data(i,2),'ro'); end end plot(C1(1,1),C1(1,2),'b+'); plot(C2(1,1),C2(1,2),'b+'); plot(C3(1,1),C3(1,2),'b+'); title('聚类后数据');
评论
    相关推荐