K-means算法Matlab实现

K-means算法Matlab实现

本文只给出二维数据的K-means算法Matlab实现,理论推导参考了算法收敛性证明【机器学习】K-means(非常详细)聚类算法——K-均值算法,此处不详细介绍。
编写程序过程中,发现初始化不同的起始中心点,算法运行的结果不同,有时会收敛至局部最优值。为了解决这个问题,可以使用改进的K-means++算法,本文没有进行实现。
聚类结果
实现代码如下:

clc;clear all;
p=[1 2;2 2;2 5;3,3;9,14;10,13;10,15;11,16;15,6;16,5;16,8]';
x=p(1,:);
y=p(2,:);
k=3;
cluster=zeros(1,length(x));
center=zeros(2,k);
%绘制二维数据
%scatter(x,y);
%初始化中心
for i=1:k
    offset=5;
    center(:,i)=p(:,i+offset);%设置不同的起始中心点,
end
while(1)
    %分类
    for i=1:length(x)
        for j=1:k
            distance(j)=norm(center(:,j)-p(:,i));%计算与每个中心的距离 
        end
        [min_dist(i),index]=min(distance);%求出最小值及其索引
        cluster(i)=index;
    end
    %计算误差平方和
    J=sum(min_dist);
    %绘图
     clf;
     scatter(x,y,[],cluster);
     hold on;
     scatter(center(1,:),center(2,:),'filled','black');title(['误差平方和为' num2str(J)]);
     pause(1);%延时一秒
    %重新寻找质心
    for i=1:k
            new_center(:,i)= mean(p(:,cluster==i),2);%计算新的中心 
    end
    %跳出循环
    if new_center==center
        break;
    else
        center=new_center;
    end
end

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值