k-means聚类算法(matlab实现)

k-means聚类算法


前言

k-means聚类算法是硬聚类算法的一种,即在n纬欧几里得空间把n个样本数据分为k类。首先根据用户要确定聚类的数目k,随机性的选取k个样本,把每一个对象成为一个种子,每一个种子代表一个类的中心,对其余的每个对象,采用近邻原则,将它们赋给最近的类。重新计算在每个类中对象的均值新形成的聚类中心,重复进行这个过程直到函数式收敛为止。

k-means聚类算法的改进:
k-means++算法链接: https://blog.csdn.net/qq_40276082/article/details/130237784?spm=1001.2014.3001.5501


一、k-means聚类算法简介

K-means算法是一种无监督学习算法,用于将n个数据点划分为k个簇(cluster)。该算法的主要思想是将数据点划分为k个簇,使得同一簇内的数据点彼此相似,而簇间的数据点相差较大。
K-means算法是一种迭代算法,其核心是利用距离度量来度量不同数据点之间的相似度,并利用质心来表示簇的中心。在每次迭代中,算法通过更新簇质心和重新分配数据点来优化簇的划分。具体来说,算法的步骤如下:

初始化:随机选择k个数据点作为初始质心,将所有数据点分配到距离最近的质心所在的簇中。

簇分配:对于每个数据点,计算其到k个质心的距离,将其分配到距离最近的质心所在的簇中。

更新质心:对于每个簇,计算其所有数据点的平均值,将其作为新的质心。

重复步骤2和步骤3,直到簇的分配不再改变或达到最大迭代次数。

二、k-means聚类算法步骤

在这里插入图片描述

三、代码实现

代码如下(示例):

clc
clear
a=[22.5661	113.9808	66
22.6862	113.9405	65.5
22.5648	114.2446	75
22.5589	113.9507	65.5
22.559	114.2413	75
22.5628	113.9566	65.5
22.5	113.8957	66
22.5249	113.9309	65.5
22.5191	113.9358	65.5
22.4982	113.8985	66
23.0057	112.9708	75
23.0391	113.0726	66
22.9408	113.0627	72.5
23.0408	113.1116	65
23.0387	113.1074	65.5
23.0042	113.0704	66.5
23.0489	113.0719	66
23.0104	113.1463	66
23.0058	113.1356	65.5
22.8821	113.2179	68.5
23.0401	113.1075	65.5
22.9946	113.1409	72
22.9789	113.0167	72
22.9456	113.09	72
23.0441	113.1258	65.5
];
N=length(a(:,1));
X=[];
Y=[];

for j=1:N
    f=a(j,1);
w=a(j,2);
X=vertcat(X,f);
Y=vertcat(Y,w);

end
N=length(X(:,1));
plot(X, Y, 'k*'); % 绘出原始的数据点
xlabel('X');
ylabel('Y');
title('聚类之前的数据点');
n = 2; %将所有的数据点分为两类
m = 1; %迭代次数
eps = 1e-7; % 迭代结束的阈值
u1 = [X(1),Y(1)]; %初始化第一个聚类中心
u2 = [X(2),Y(2)]; %初始化第二个聚类中心
U1 = zeros(2,100);
U2 = zeros(2,100); %U1,U2 用于存放各次迭代两个聚类中心的横纵坐标
U1(:,2) = u1;
U2(:,2) = u2;
D = zeros(2,N); %初始化数据点与聚类中心的距离
while(abs(U1(1,m) - U1(1,m+1)) > eps || abs(U1(2,m) - U1(2,m+1) > eps || abs(U2(1,m) - U2(1,m+1)) > eps || abs(U2(2,m) - U2(2,m+1)) > eps))
    m = m +1;
    % 计算所有点到两个聚类中心的距离
for i = 1 : N
    D(1,i) = sqrt((X(i) - U1(1,m))^2 + (Y(i) - U1(2,m))^2);
end
for i = 1 : N
    D(2,i) = sqrt((X(i) - U2(1,m))^2 + (Y(i) - U2(2,m))^2);
end
A = zeros(2,N); % A用于存放第一类的数据点
B = zeros(2,N); % B用于存放第二类的数据点
for k = 1: N
    [MIN,index] = min(D(:,k)); 
    if index == 1  % 点属于第一个聚类中心
        A(1,k) = X(k);
        A(2,k) = Y(k);
    else           % 点属于第二个聚类中心
        B(1,k) = X(k);
        B(2,k) = Y(k);
    end
end
indexA = find(A(1,:) ~= 0); % 找出第一类中的点
indexB = find(B(1,:) ~= 0); % 找出第二类中的点
U1(1,m+1) = mean(A(1,indexA));
U1(2,m+1) = mean(A(2,indexA));
U2(1,m+1) = mean(B(1,indexB));
U2(2,m+1) = mean(B(2,indexB)); % 更新两个聚类中心
end
figure;
plot(A(1,indexA) , A(2,indexA), '*b'); % 作出第一类点的图形
hold on
plot(B(1,indexB) , B(2,indexB), '*g'); %作出第二类点的图形
hold on
centerx = [U1(1,m) U2(1,m)]
centery = [U1(2,m) U2(2,m)]
plot(centerx , centery, 'or'); % 画出两个聚类中心点
xlabel('X');
ylabel('Y');
title('聚类之后的数据点');
disp(['迭代的次数为:',num2str(m)]);

运行结果:
在这里插入图片描述


总结

K-means算法的优点在于简单、易于实现,适用于大型数据集。但是,它也有一些缺点。首先,K-means算法对于数据点分布的先验知识敏感,且容易收敛到局部最优解。其次,K-means算法要求每个簇的大小相等,这在某些情况下可能会导致不合理的结果。最后,K-means算法对于噪声和异常值敏感,因为它只考虑数据点之间的欧几里德距离,而没有考虑其他距离度量或数据结构。

  • 11
    点赞
  • 107
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: k-means聚类算法是一种常用的无监督学习算法,可以将数据集分成k个簇,每个簇内的数据点相似度较高,不同簇之间的数据点相似度较低。Matlab提供了k-means聚类算法实现,可以通过调用kmeans函数来实现。该函数需要输入数据集和簇的个数k,输出每个数据点所属的簇的编号以及簇的中心点坐标。可以通过调整k的值来控制簇的个数,从而得到不同的聚类结果。 ### 回答2: K-means算法是一种基础的聚类算法,常用于数据分析、模式识别和图像处理等领域。在Matlab中,实现K-means聚类算法非常简单。 首先,我们需要准备数据集和确定聚类的个数K。数据集可以是一组有标记数据,也可以是无标记数据。而K值则需要预先设置,它表示将数据集划分成K个簇。 在Matlab中,可以使用kmeans函数来实现K-means聚类算法。以下是一个基本的实现步骤: 1. 载入数据集。数据集可以用Matlab内置的数据类型,也可以从外部文件中读取。 2. 预处理数据集。这通常包含特征缩放、标准化、均值化等操作。这些操作有助于提高聚类效果。 3. 调用kmeans函数。该函数需要传入两个参数:数据集和K值。此外,还可以设置其他一些可选参数,如最大迭代次数、初始聚类中心等。 4. 获取聚类结果。聚类结果包含每个数据点被划分到的簇编号。可以通过绘图等方式来展示聚类结果,以便进一步分析和评价。 5. 对聚类结果进行评价。评价指标通常包括SSE(误差平方和)、轮廓系数等。这些指标可以帮助我们判断聚类的效果如何。 下面通过一个简单的例子来演示K-means聚类算法实现。 假设我们有如下一组二维数据: data = [0.5 1.2; 0.3 1.0; 0.4 1.5; 1.4 2.0; 1.2 1.8; 1.3 2.5; 3.5 3.8; 3.0 4.2; 2.7 4.5; 3.2 3.5]; 我们需要将它们聚成三个簇。在Matlab中,我们可以这样实现: 1. 载入数据集。 2. 预处理数据集。这里我们不需要进行任何操作,因为数据点已经在同一尺度下,并且没有缺失值。 3. 调用kmeans函数。我们设置K=3,最大迭代次数为100次。初始聚类中心默认是随机生成的。 [idx,centroids,sumd] = kmeans(data,3,'MaxIter',100); 4. 获取聚类结果。idx为每个数据点所属的簇编号,centroids为每个簇的中心点坐标,sumd为SSE值。 5. 对聚类结果进行评价。这里我们使用轮廓系数作为评价指标。轮廓系数越大,表示聚类效果越好。 [s,h] = silhouette(data,idx); 最终的聚类结果和轮廓系数如下图所示: ![K-means聚类算法matlab实现图示](https://i.imgur.com/6sd97v0.png) 可以看到,聚类效果比较好,各个簇之间距离比较大,簇内距离比较小。轮廓系数为0.92,非常接近1,说明聚类效果很好。 总的来说,K-means聚类算法Matlab中是一个非常简单的实现,只需要几行代码就能实现。然而,在实际应用中,选择合适的K值和评价指标,以及对数据进行预处理等步骤,这些都会影响聚类效果。因此,Matlab提供了丰富的工具和函数来帮助我们实现高质量的聚类分析。 ### 回答3: k-means聚类算法是一种经典的无监督学习算法,常用于将一组数据分成k个类别。在matlab实现k-means聚类算法有多种方式,可以使用自带的函数kmeans,也可以手动编写代码实现。 一、使用matlab自带函数kmeans 1.1 函数介绍 kmeans函数是matlab自带的实现k-means聚类算法的函数。它的具体使用方法如下: [idx, C] = kmeans(X, k) 其中,X是数据集,k是需要聚类的类别数,idx是每个样本所属的类别编号,C是每个类别的中心点。 1.2 使用方法 使用kmeans函数对数据进行聚类的具体步骤如下: (1)准备数据 需要将需要聚类的数据保存在矩阵X中。 (2)确定聚类数目 需要确定需要聚类的类别数目k。一般可以通过观察数据以及领域知识来确定。 (3)调用kmeans函数进行聚类 调用kmeans函数进行聚类,即输入数据矩阵X和聚类数目k,函数会输出每个样本所属的类别编号idx以及每个类别的中心点C。 (4)可视化 使用matlab的图形工具对数据进行可视化,便于观察聚类效果。 二、手动编写代码实现 2.1 实现思路 手动编写代码实现k-means聚类算法的基本思路如下: (1)随机选择k个点作为聚类中心。 (2)将每个样本点分配给距离最近的聚类中心。 (3)更新每个聚类的中心点。 (4)重复步骤(2)和(3),直到聚类结果不再改变。 2.2 算法流程 实现k-means聚类算法的具体流程如下: (1)随机选择k个点作为聚类中心。 (2)计算每个样本点与每个聚类中心的距离,找到距离最近的聚类中心,并将样本点分配给该聚类。 (3)按照每个聚类中的样本点重新计算聚类中心。 (4)重复步骤(2)和(3),直到聚类结果不再改变。 2.3 实现代码 可以通过以下代码实现k-means聚类算法: function [idx, C] = My_KMeans(X, k) % Input: % X: 数据集,每行代表一个样本; % k: 聚类数目; % % Output: % idx: 每个样本点所属的聚类编号; % C: 每个聚类的中心点。 [m, n] = size(X); % 随机选择k个点作为聚类中心 C = X(randperm(m, k), :); % 初始化idx idx = zeros(m, 1); % 计算每个样本点与每个聚类中心的距离 D = pdist2(X, C); % 迭代聚类过程 while true % 找到每个样本点距离最近的聚类中心 [d, new_idx] = min(D, [], 2); % 判断聚类结果是否满足终止条件 if new_idx == idx break; end idx = new_idx; % 更新每个聚类的中心点 for i = 1:k sel = (idx == i); C(i, :) = mean(X(sel, :), 1); end D = pdist2(X, C); end end 参考资料: [1] https://ww2.mathworks.cn/help/stats/kmeans.html [2] https://blog.csdn.net/u014793102/article/details/68472074 [3] https://blog.csdn.net/qq_40435156/article/details/82649045
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一寸光阴不可轻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值