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

article/2025/10/21 15:56:54

k-means简介

  k-means算法也称k均值算法,是一种常用的聚类算法。聚类算法是研究最多、应用最广的一种无监督学习算法。
  聚类试图将数据集中的样本划分为若干个通常是不相交的子集,每个子集称为一个“簇”。通过这样的划分,每个簇里的样本可能具有一些潜在的、共同的特质。
  例如,对于给定样本集D={x1,x2,x3,…,xm}包含m个无标记样本,其中每个样本xi是一个n维的特征向量,聚类算法将样本集D划分为k个不相交的簇。其中,k个簇之间互不相交,且k个簇的并集为D。

k-means原理

k-means的伪代码

输入:样本集D = {x1,x2,x3,...,xm};聚类簇数k.
过程:
从D中随机抽取k个样本作为初始均值向量{u1,u2,...,uk}
repeat初始化Cl = ∅(1≤l≤k)for i = 1:m计算样本xi与各均值向量uj(1≤j≤k)的距离d;根据距离最近的均值向量确定xi的簇标记;将样本xi划入相应的簇Cl;endfor j = 1:k计算新的均值向量new_uj:对簇中每个样本求和/簇中样本的个数if new_uj ≠ uj将当前均值向量uj更新为new_ujelse保持当前均值向量不变endend
until 当前均值向量均未更新
输出:簇划分为C = {C1,C2,...,Ck}

k值的选取

  有手肘法和轮廓系数法两种方法。这里简单介绍手肘法。
  手肘法的核心指标是SSE(Sum of Squared Errors),误差平方和
S S E = ∑ i = 1 k ∑ x ∈ C i ∣ ∣ x − μ i ∣ ∣ 2 2 SSE=\sum_{i=1}^{k}\sum_{x\in C_i}||x-\mu_i||_2^2 SSE=i=1kxCixμi22
其中,Ci是第i个簇,x是Ci中的样本点,μi是Ci的质心(Ci中所有样本的均值)。直观来看,该式是求当前的k值所对应的簇内的各个样本点到中心点欧式距离的平方和,该数值能体现出聚类后各个簇中样本点的密集程度,即SSE值越小,各个簇中的样本点越密集。
  对K值进行迭代,分别计算出相应的SSE。随着k值的增大,SSE会随之减小。这是因为随着k值的增大,样本会被划分得更加细致,每个簇就会更加紧凑。
  SSE的值会随着K值的增大而不断减小,直到k值与样本集中样本点的个数相等,此时SSE达到最小值。显然,并不是SSE的值越小,所选的K值就越合理。
  观察SSE随K值变化而变化的图像,分析K最合理的取值。(代码在后面放出来)
SSE—K图像
  从图像上看,当K值小于3时,SSE下降的幅度很大;而当K值大于3之后SSE下降的幅度大幅减小,这说明K值已经超过了最“合理”的值,从而导致每次减小K所带来的“收益”大幅减小,因此最佳的K值为3。由于图像看起来像手肘,因此这种选取最佳K值的方式被称为“手肘法”。

k-means的实现

  首先编写一个计算“有序属性”距离的函数,也可以使用matlab中自带的pdist或者是norm函数,推荐使用norm。

function dist = cal_dist(X,p)
%计算两个样本点之间的闵可夫斯基距离,当p=2时即为欧氏距离,当p=1时即为曼哈顿距离
dim = size(X);
sum = 0;
for i = 1:dim(2)sum = sum + abs(X(1,i)-X(2,i))^p; 
end
dist = sum^(1/p);
end

  再写一个归一化处理数据的函数。

function data = normalization(x)
%归一化处理数据
d = size(x);
data = zeros(d(1),d(2));
for i = 1:d(2)l = x(:,i);data(:,i) = (l - min(l))/(max(l)-min(l)); 
end
end

  然后进入正题。

function [index,C,sumd] = Kmeans(sample, k, threshold, n)
%K均值算法
%C:k个簇中心
%index:聚类后每个样本的标记
%sumd:样本点到相应的簇心的距离
%sample:需要进行聚类的样本
%k:划分簇的个数
%threshold:差异度阈值
%n最大迭代次数
iter = 0;
dim = size(sample);
index = zeros(dim(1), 1);
dist = zeros(k, 1);
C = sample(randperm(dim(1), k), :);
while 1sumd = zeros(dim(1), 1);for i = 1:dim(1)for j = 1:kX = [sample(i, :);C(j, :)];dist(j) = cal_dist(X, 2);end[d, idx] = min(dist);sumd(i) = d;index(i) = idx;endnew_C = zeros(k, dim(2));c = 0;for i = 1:kcount = 0;for j = 1:dim(1)if index(j) == icount = count + 1;new_C(i, :) = new_C(i, :) + sample(j, :);endendnew_C(i, :) = new_C(i, :) / count;Y = [new_C(i, :);C(i, :)];if cal_dist(Y, 2)<= thresholdc = c + 1;endenditer = iter + 1;if c == kbreakelseif iter > nbreakelseC = new_C;end
end
end

  编写一个函数打印K-SSE图像,K值的选取理念已在上文提过。

function Visualize_SSE(sample, k)
%查看SSE随K值变化而变化的图像
dim = size(sample);
coordinate = zeros(k, 2);
for i = 1:kcoordinate(i, 1) = i;if i == 1avg = mean(sample);d = zeros(dim(1), 1);for j = 1:dim(1)X = [sample(j, :);avg];d(j,1) = cal_dist(X, 2);endcoordinate(i, 2) = sum(d);else[~, ~, sumd]=Kmeans(sample, i, 0.1, 9000);sumd = sumd.^2;coordinate(i, 2)=sum(sumd);end
end
plot(coordinate(:, 1),coordinate(:, 2))
xlabel('K')
ylabel('SSE')
end

  通过分析得出最佳的K值为3,下面编写一个脚本看一下聚类效果(matlab初学者表示不清楚还有哪些数据集只好用fisheriris中meas的前两维来代替。并不是说聚类算法不能对高维空间的数据进行聚类,选择两个维度是为了结果的可视化,也可以选择三个维度。)

load fisheriris
data = normalization(meas); 
[idx,C,~] = Kmeans(data(:,1:2),3,0,5000);
figure
gscatter(data(:,1),data(:,2),idx,'bgm')
hold on
plot(C(:,1),C(:,2),'kx')
legend('Cluster 1','Cluster 2','Cluster 3','ClusterCentroid')

  聚类效果:
在这里插入图片描述
  本文为了顺带提一嘴距离度量因此自己十分简陋的写了一个计算距离的函数,实际上使用matlab中自带的norm或者pdist即可。
  本文只是对k均值进行了一个简单的介绍。聚类任务相关的性能度量和距离度量还有很多;此外,如何对高维空间中的数据进行聚类本文也不做讨论。

代码

  https://github.com/Qyokizzzz/AI-Algorithm/tree/master/K-means


http://chatgpt.dhexx.cn/article/tmCUUCOR.shtml

相关文章

matlab 层次聚类

MATLAB的统计工具箱中的多元统计分析中提供了聚类分析的两种方法&#xff1a; 1.层次聚类 hierarchical clustering 2.k-means聚类 这里用最简单的实例说明以下层次聚类原理和应用发法。 层次聚类是基于距离的聚类方法&#xff0c;MATLAB中通过pdist、linkage、dendrogram、…

K-means聚类算法及其MATLAB实现

参考&#xff1a; http://www.csdn.net/article/2012-07-03/2807073-k-means http://www.cnblogs.com/zhzhang/p/5437778.html http://blog.csdn.net/qll125596718/article/details/8243404/ K-means属于无监督学习方法 K表示类别数&#xff0c;Means表示均值&#xff0c;K…

基于MATLAB的K-means聚类算法

实验数据说明 Iris也称鸢尾花卉数据集&#xff0c;是一类多重变量分析的数据集。通过花萼长度&#xff0c;花萼宽度&#xff0c;花瓣长度&#xff0c;花瓣宽度4个属性预测鸢尾花卉属于&#xff08;Setosa(山鸢尾)&#xff0c;Versicolour(杂色鸢尾)&#xff0c;Virginica(维吉尼…

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

k-means聚类算法 文章目录 k-means聚类算法前言一、k-means聚类算法简介二、k-means聚类算法步骤三、代码实现总结 前言 k-means聚类算法是硬聚类算法的一种&#xff0c;即在n纬欧几里得空间把n个样本数据分为k类。首先根据用户要确定聚类的数目k,随机性的选取k个样本&#xf…

Kmeans聚类算法——Matlab

聚类算法 原理步骤代码绘图选取四个迭代步骤进行可视化&#xff08;散点图&#xff0c;条形图&#xff09;聚类结果可视化&#xff08;散点图&#xff09; 原理 聚类算法的基本思想是&#xff1a;以空间中k个点为中心进行聚类&#xff0c;对距离他们最近的对象进行归类。通过迭…

matlab实现聚类算法

simulate2020625数据集 clear;clc load simulate2020625;kmax(subcluster(:,3));%设置聚类数目 data subcluster(:,1:2); cata subcluster; [m,n]size(data); c1subcluster(:,3); c1c1;%% 实际聚类图 figure(1); plot(cata(cata(:,3)1,1),cata(cata(:,3)1,2),r*) hold on pl…

K-means++聚类算法(matlab实现)

K-means聚类算法 文章目录 K-means聚类算法前言一、算法简介二、K-means算法步骤三、K-means算法matlab实现总结 前言 K-means算法&#xff1a;K-means算法是K-means算法的改进版&#xff0c;其在选择初始质心时采用了一种更加聪明的方法&#xff0c;能够有效地避免局部最优解…

MATLAB聚类分析(Cluster Analysis)

使用环境&#xff1a;MATLAB2016a、MATLAB2010a 聚类分析是一种无监督式学习&#xff0c;不像回归分析等需要Inputs 和 Targets &#xff0c;聚类分析是只通过提供一组数据实现分类的算法。下面给出本人在学习聚类分析的MATLAB程序 x15*[randn(500,1)5,randn(500,1)5]; x25*[…

matlab统计与机器学习工具箱中的7种聚类算法

1. matlab中自带聚类算法概述 本文简要概述了matlab统计和机器学习工具箱中可用的聚类方法&#xff0c;并给出了其聚类函数。在使用过程中&#xff0c;直接调用该函数即可&#xff0c;十分方便&#xff0c;不得不感慨matlab的强大。 聚类分析&#xff0c;又称分割分析或分类分…

K-mean(多维度)聚类算法(matlab代码)

申明: 仅个人小记。 Email: officeforcsdn163.com 目录 效果演示二维度三维度 k-mean 算法思想简要说明代码分析二维度k-mean代码三维度k-mean代码多维度k-mean代码功能使用示范后期函数接口改造 (借助matlab中cell结构实现)新的函数接口使用范例 小结 效果演示 二维度 (1) K…

k-Means——经典聚类算法实验(Matlab实现)

聚类算法—k-Means实验 k-平均&#xff08;k-Means&#xff09;&#xff0c;也被称为k-均值&#xff0c;是一种得到最广泛使用的聚类算法[1]. k-Means算法以k为参数&#xff0c;把n个对象分为k个簇&#xff0c;使得簇内具有较高的相似度。 实验目的 了解常用聚类算法及其优缺…

MATLAB K-means聚类的介绍与使用

K-means算法是硬聚类算法 &#xff0c;是典型的基于原型的目标函数 聚类方法的代表&#xff0c;它是数据点到原型的某种距离作为优化的目标函数&#xff0c;利用函数求极值的方法得到迭代运算的调整规则。K-means算法以偶是距离 作为相似度测度&#xff0c;它是求对应某一初…

MatLab Kmeans聚类

机器学习以及人工智能的学习需要扎实的数学功底才能走的更远&#xff0c;爬的更高&#xff0c;所以打好数学基础是关键&#xff0c;但无论工作学习都没有充足的时间去拿着书本一个字一个字的去学习了&#xff0c;这里我建议大家找几个比较靠谱入门的机器学习或者人工智能学习平…

聚类分析(二)k-means及matlab程序

1.介绍 k-means是一种常见的基于划分的聚类算法。划分方法的基本思想是&#xff1a;给定一个有N个元组或者记录的数据集&#xff0c;将数据集依据样本之间的距离进行迭代分裂&#xff0c;划分为K个簇&#xff0c;其中每个簇至少包含一条实验数据。 2.k-means原理分析 2.1工作原…

数据挖掘实验(七)Matlab实现聚类算法【clusterdata / kmeans】

本文代码均已在 MATLAB R2019b 测试通过&#xff0c;如有错误&#xff0c;欢迎指正。 另外&#xff0c;这次实验都是调用Matlab现成的函数&#xff0c;没什么技术含量。 &#xff08;一&#xff09;聚类分析的原理 聚类是将数据分类到不同的类或者簇这样的一个过程&#xff…

K-means聚类 —— matlab

目录 1.简介 2.算法原理 3.实例分析 3.1 读取数据 3.2 原理推导K均值过程 3.3 自带kmeans函数求解过程 完整代码 1.简介 聚类是一个将数据集中在某些方面相似的数据成员进行分类组织的过程&#xff0c;聚类就是一种发现这种内在结构的技术&#xff0c;聚类技术经常被称为…

聚类分析的Matlab 程序—系统聚类(附有案例分析)

聚类分析的Matlab 程序—系统聚类 (1)计算数据集每对元素之间的距离,对应函数为pdistw. 调用格式&#xff1a;Ypdist(X),Ypdist(X,’metric’), Ypdist(X,’distfun’),Ypdist(X,’minkowski’,p) 说明&#xff1a;X是m*n的矩阵&#xff0c;metric是计算距离的方法选项&…

如何运用MATLAB实现K-MEANS聚类分析

由于自己最近在学习聚类分析&#xff0c;也算是一个入门&#xff0c;相当于将自己这段时间的学习成果进行一个总结&#xff0c;分享给更多打算学习聚类分析或者需要用到聚类分析的同学们~ 在了解K-MEANS聚类分析之前&#xff0c;我们首先明确聚类的含义&#xff0c;聚类是将数…

Matlab实现Kmeans聚类算法

1.Kmeans聚类算法简介 kmeans聚类算法是一种迭代求解的聚类分析算法。其实现步骤如下&#xff1a; (1) 随机选取K个对象作为初始的聚类中心 (2) 计算每个对象与各个种子聚类中心之间的距离&#xff0c;把每个对象分配给距离它最近的聚类中心。 (3) 聚类中心以及分配给它们的对象…

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

例子如下&#xff1a; 假设数据挖掘的任务是将如下的8个点&#xff08;用&#xff08;x&#xff0c;y&#xff09;代表位置&#xff09;聚类为3个簇。 距离是欧氏距离。假设初始我们选择&#xff0c;和分别为每个簇的中心&#xff0c;用k-均值算法给出&#xff1a; a)在第一轮…