K-means聚类分析

% 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;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值