Matlab实现简单K-means聚类算法

本文介绍了如何在Matlab中实现K-means聚类算法,包括算法思想、实现步骤和分析。通过实例展示了算法在二维和三维数据上的应用,强调了初始质心选择对结果稳定性的影响,并提出优化建议。最后总结了K-means算法的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

K-means算法简要思想:

算法接受参数 k ;然后将事先输入的n个数据对象划分为 k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。
(1)适当选择k个类的初始中心;
(2)在第k次迭代中,对任意一个样本,求其到各中心的距离,将该样本归到距离最短的中心所在的类;
(3)利用均值等方法更新类的中心值;
(4)对于所有的c个聚类中心,如果利用(2)(3)的迭代法更新后,中心值保持不变或者满足变化距离小于一个精度或者达到最大迭代次数,则迭代结束,否则继续迭代。

实现步骤:

实验提供了两组数据(二维和三维),算法都能适用,这里我们以三维数据作为说明。首先读入数据,用scatter3将三维数据通过散点图显示出来:

load 3d-data.mat;  %load数据,存在变量r中
figure(1);scatter3(r(:,1),r(:,2),r(:,3),'k');title('原始样本');

结果见下图1:
三维原始数据

                        图1 三维样本集原始数据散点图    

通过图1可以明显看出,样本集聚为7个簇,因此可将K初始化为7,然后随机选取7个中心点,存于clusters矩阵中:

clusters=zeros(K,cols);
for i=1:K
    clusters(i,:)=r(floor(rand*rows),:);  %随机选取K个质心
end

质心选取后,需要计算每个样本点与K个质心的距离,存于dist矩阵中,并从此处开始迭代(for i=1:maxiter):

dist=zeros(rows,K);
for iter=1:maxiter
    for i=1:rows
        for j=1:K
            dist(i,j)=sqrt(sum(( r(i,:)-clusters(j,:)).^2)); %dist存的是每一个样本数据与K个质心的距离,大小为rows*K
        end
    end

矩阵dist中存了每个样本集与K个质心的距离,维数为rows*K,由于我们需要选出距离最小的那个质心,也就是要从矩阵dist每一行中选出最小数所在的位置,我们可以先将dist

评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值