手把手教你实现Kmeans聚类,不使用MATLAB工具箱,纯手写matlab代码免费获取,UCI数据集为例...

K均值(K-means)是一种常用的聚类算法,用于将数据集划分为K个不同的组(簇),使得每个数据点属于与其最近的均值点所代表的簇。K均值算法的基本思想是通过迭代优化,将数据点分配到K个簇中,并调整簇的均值(中心)以最小化簇内数据点与对应中心点之间的距离。

K均值算法的步骤如下

①初始化:随机选择K个初始中心点(可以是数据集中的任意数据点)作为各个簇的中心。

②分配数据点:对于每个数据点,计算其与各个中心点的距离,并将其分配到距离最近的簇中。

③更新中心点:对于每个簇,计算该簇所有数据点的均值,更新该簇的中心点。

④重复步骤②和步骤③:直到满足停止条件(如中心点不再发生变化或达到最大迭代次数)。

K均值算法的目标是最小化所有数据点与其所属簇中心点之间的距离之和(即簇内的总方差)。这意味着每个簇的中心点应该尽可能代表该簇内的数据点,同时不同簇之间的中心点应该尽可能远离彼此。

K均值算法的优点包括简单易实现、计算效率高,适用于大规模数据集。然而,K均值算法也有一些缺点,例如对K值的选择敏感、对初始中心点的选择敏感,还有可能收敛到局部最优解等。

在实际应用中,K均值算法常用于聚类分析、图像分割、异常检测等领域。需要注意的是,K均值算法对于非凸形状的簇效果可能不佳,因此在某些情况下可能需要其他更复杂的聚类算法来处理数据。

纯MATLAB代码实现Kmeans

以UCI常用数据集Aggregation.mat为例进行展示。

Aggregation数据集具有两个特征,7种类别。matlab代码实现如下:

%% k-means聚类
clc
clear
closeload Aggregation.mat
data = Aggregation(:,2:3);%% 聚类
N = 7;  % 设定聚类数量
[m,n] = size(data);
pattern = zeros(m,n+1);   % n+1列用于标记当前点所分配到的类索引号
center = zeros(N,n);      % 初始化聚类中心
pattern(:, 1:n) = data(:,:);
for x=1:Ncenter(x,:) = data(randi(788,1), :);    % 第一次随机产生聚类中心坐标
endwhile 1distance = zeros(1,N);num = zeros(1,N);       % 记录各个类中包含元素个数new_center=zeros(N,n);  % 保存新得到的聚类中心for x=1:mfor y=1:Ndistance(y) = norm(data(x,:)-center(y,:)); % 计算点到每个类的距离end[~, temp] = min(distance);  % 获取当前点到几个类的最小距离pattern(x, n+1) = temp; % 标记x位置的点分配到对应的类中endk = 0;% 将同一个类中的点坐标相加,计算新的中心坐标for y=1:Nfor x=1:mif pattern(x, n+1) == ynew_center(y,:) = new_center(y,:)+pattern(x, 1:n);num(y) = num(y)+1;endend% 计算得到新的聚类中心点new_center(y,:) = new_center(y,:)/num(y);if norm(new_center(y,:)-center(y,:))<0.1% 是否接受当前新产生的聚类中心点k=k+1;endendif k==Nbreak;elsecenter = new_center;end
end
[m, n]=size(pattern);%% 显示聚类后的数据
figure
hold on;
grid on;
for i=1:mif pattern(i,n)==1plot(pattern(i,1),pattern(i,2),'r.','Markersize', 8);plot(center(1,1),center(1,2),'kx','Markersize', 18);elseif pattern(i,n)==2plot(pattern(i,1),pattern(i,2),'g.','Markersize', 8);plot(center(2,1),center(2,2),'kx','Markersize', 18);elseif pattern(i,n)==3plot(pattern(i,1),pattern(i,2),'b.','Markersize', 8);plot(center(3,1),center(3,2),'kx','Markersize', 18);elseif pattern(i,n)==4plot(pattern(i,1),pattern(i,2),'c.','Markersize', 8);plot(center(4,1),center(4,2),'kx','Markersize', 18);elseif pattern(i,n)==5plot(pattern(i,1),pattern(i,2),'m.','Markersize', 8);plot(center(5,1),center(5,2),'kx','Markersize', 18);elseif pattern(i,n)==6plot(pattern(i,1),pattern(i,2),'y.','Markersize', 8);plot(center(6,1),center(6,2),'kx','Markersize', 18);elseif pattern(i,n)==7plot(pattern(i,1),pattern(i,2),'k.','Markersize', 8);plot(center(7,1),center(7,2),'kx','Markersize', 18);endendtitle('cluster result')

结果如下:

77263e11af0531b139cb36317713f30d.png

可以看到,数据集被完美的分为7类!


MATLAB自带Kmeans

%% matlab自带k-means聚类
clc
clear
closeload Aggregation.mat
data = Aggregation(:,2:3);%% 使用matlab自带k-means聚类
x = data;
[idx, c] = kmeans(x, 7); % 聚成7类figure
plot(x(idx==1, 1), x(idx==1,2), 'r.', 'MarkerSize', 10)
hold on
plot(x(idx==2, 1), x(idx==2,2), 'g.', 'MarkerSize', 10)
plot(x(idx==3, 1), x(idx==3,2), 'b.', 'MarkerSize', 10)
plot(x(idx==4, 1), x(idx==4,2), 'c.', 'MarkerSize', 10)
plot(x(idx==5, 1), x(idx==5,2), 'm.', 'MarkerSize', 10)
plot(x(idx==6, 1), x(idx==6,2), 'y.', 'MarkerSize', 10)
plot(x(idx==7, 1), x(idx==7,2), 'k.', 'MarkerSize', 10)
plot(c(:,1),c(:,2), 'kx', 'MarkerSize', 12, 'LineWidth',3)
legend('cluster 1', 'cluster 2', 'cluster 3','cluster 4','cluster 5','cluster 6','cluster 7', 'center', 'Location', 'NW')
title('cluster result')
grid on
hold off

代码更简洁!且分类效果更好:

813780c1e74366224783e0a3793f0b59.png

好啦,本期分到此结束。完整代码免费获取,请后台回复关键词:

K均值

另附上UCI数据集:

值得收藏的12种公开数据集,发电预测,轴承诊断,机器学习等数据,免费获取,速来!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/674012.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言的联合体:一种节省内存的数据结构

在C语言中&#xff0c;联合体&#xff08;union&#xff09;是一种特殊的数据结构&#xff0c;它允许我们在相同的内存位置存储不同的数据类型。这意味着联合体中的所有成员都共享同一块内存空间&#xff0c;因此它们不能同时存储其各自的值。联合体的主要目的是节省内存&#…

【RT-DETR有效改进】重参数化模块DiverseBranchBlock助力特征提取(附代码 + 修改教程)

&#x1f451;欢迎大家订阅本专栏&#xff0c;一起学习RT-DETR&#x1f451; 一、本文介绍 本文给大家带来的是改进机制是一种替换多元分支模块&#xff08;Diverse Branch Block&#xff09;&#xff0c;Diverse Branch Block (DBB) 是一种用于增强卷积神经网络性能的结构…

Duplicate entry ‘1xx-2xx-3xx-4xx‘ for key ‘uniq_index‘的解决方法

我在往sql数据库新增数据的时候&#xff0c;碰到报错类似标题。 意思大概是插入的数据重复了&#xff0c;下面分享两种解决办法。 第一种 找到某一节对应的字段&#xff0c;然后在原sql语句里改动这一节的数据&#xff0c;重新执行新增操作。 比如ABC20240208-aaa-yangguang-…

牛客网SQL进阶137:第二快/慢用时之差大于试卷时长一半的试卷

官网链接&#xff1a; 第二快慢用时之差大于试卷时长一半的试卷_牛客题霸_牛客网现有试卷信息表examination_info&#xff08;exam_id试卷ID, tag试卷类别,。题目来自【牛客题霸】https://www.nowcoder.com/practice/b1e2864271c14b63b0df9fc08b559166?tpId240 0 问题描述 试…

基于tomcat的https(ssl)双向认证

一、背景介绍 某个供应商服务需要部署到海外&#xff0c;如果海外多个地区需要部署多个服务&#xff0c;最好能实现统一登录&#xff0c;这样可以减轻用户的使用负担&#xff08;不用记录一堆密码&#xff09;。由于安全问题&#xff08;可能会泄露用户数据&#xff09;&#x…

【数据结构】二叉树的三种遍历(非递归讲解)

目录 1、前言 2、二叉树的非递归遍历 2.1、先序遍历 2.2、中序遍历 2.3、后序遍历 1、前言 学习二叉树的三种非递归遍历前&#xff0c;首先来了解一下递归序&#xff1a; 递归序就是按照先序遍历的顺序&#xff0c;遇到的所有结点按顺序排列&#xff0c;重复的结点也必须记…

Debian系统中挂载一个数据盘

如果你想在Debian系统中挂载一个名为sdb的数据盘&#xff0c;你可以按照以下步骤操作。请注意&#xff0c;这里假设sdb是整个磁盘的设备名&#xff0c;而不是特定的分区。如果你想要挂载磁盘上的特定分区&#xff0c;设备名可能会是sdb1、sdb2等。 如下是我执行成功得命令&…

深度学习(14)--x.view()详解

在torch中&#xff0c;常用view()函数来改变tensor的形状 查询官方文档&#xff1a; torch.Tensor.view — PyTorch 2.2 documentationhttps://pytorch.org/docs/stable/generated/torch.Tensor.view.html#torch.Tensor.view示例 1.创建一个4x4的二维数组进行测试 x torch.…

containerd中文翻译系列(十)镜像验证

下面将介绍默认的 "bindir"ImageVerifier插件实现。 要启用图像验证&#xff0c;请在 containerd 配置中添加类似下面的一段&#xff1a; [plugins][plugins."io.containerd.image-verifier.v1.bindir"]bin_dir "/opt/containerd/image-verifier/b…

NC6X单点登录设计文档说明

前言 因为业务场景需要&#xff0c;第三方系统有些工作需要经常到NC系统里做&#xff0c;如果每次去NC系统做业务单据&#xff0c;都需要反复登录&#xff0c;导致客户使用体验不是很好&#xff0c;所以需要开发实现从第三方系统单点登录到NC系统&#xff0c;提高客户满意度。 …

最短路径dfs,数组模拟邻接表

给定一个 n个节点的树。节点编号为 1∼n。树中所有边均为双向边&#xff0c;且长度均已知。你需要从 1 号点出发&#xff0c;沿着一条路径遍历树中所有点&#xff0c;路径中可以包含重复的点和边。要求&#xff0c;你的行程总长度应尽可能短。请你计算&#xff0c;你所需的行程…

零基础学编程系列,从入门到精通,中文编程开发语言工具下载,编程构件容器件之控制面板构件用法

零基础学编程系列&#xff0c;从入门到精通&#xff0c;中文编程开发语言工具下载&#xff0c;编程构件容器件之控制面板构件用法 一、前言 编程入门视频教程链接 https://edu.csdn.net/course/detail/39036 编程工具及实例源码文件下载可以点击最下方官网卡片——软件下载…

Bug2- Hive元数据启动报错:主机被阻止因连接错误次数过多

错误代码&#xff1a; 在启动Hive元数据时&#xff0c;遇到了以下错误信息&#xff1a; Caused by: java.sql.SQLException: null, message from server: "Host 192.168.252.101 is blocked because of many connection errors, unblock with mysqladmin flush-hosts&qu…

Maven pom的distributionManagement配置

目录 1 构件的发布 2 推送仓库设置&#xff08;常用&#xff09; 3 部署网站和文档 4 重命名构件 distributionManagement的作用是"分发构件至远程仓库"。 mvn install 会将项目生成的构件安装到本地Maven仓库&#xff0c;mvn deploy 用来将项目生成的构件分发到…

PdfFactory Pro软件下载以及序列号注册码生成器

PdfFactory Pro注册机是一款针对同名虚拟打印机软件所推出的用户名和序列号生成器。PdfFactory Pro是一款非常专业的PDF虚拟打印软件&#xff0c;通过使用这款注册机&#xff0c;就能帮助用户免费获取注册码&#xff0c;一键激活&#xff0c;永久免费使用。 pdffactory7注册码如…

分享一下 uniapp 打包安卓apk

首先需要安装 Java 环境&#xff0c;这里就不做解释了 第二步&#xff1a;打开 mac 终端 / cmd 命令行工具 使用keytool -genkey命令生成证书 keytool -genkey -alias testalias -keyalg RSA -keysize 2048 -validity 36500 -keystore test.keystore *testalias 是证书别名&am…

代码随想录Day43 | 1049. 最后一块石头的重量 II 494. 目标和

代码随想录Day43 | 1049. 最后一块石头的重量 II 494. 目标和 1049.最后一块石头的重量II494.目标和474.一和零01背包01背包应用问题 1049.最后一块石头的重量II 文档讲解&#xff1a;代码随想录 视频讲解&#xff1a; 这个背包最多能装多少&#xff1f;LeetCode&#xff1a;10…

【图形学】投影和消隐简介

投影 正交投影 对于物体上任意一点的三维坐标P(x,y,z),投影后的三维坐标为 P ′ ( x ′ , y ′ , z ′ ) P^\prime(x^\prime,y^\prime,z^\prime) P′(x′,y′,z′),那么正交投影的方程为 { x ′ x y ′ y z ′ 0 \begin{cases} x^\primex\\y^\primey\\z^\prime0 \end{case…

C/C++你真的了解宏吗?

宏&#xff1f;提到这个词想必很多初学者吃过它的亏&#xff0c;但是为什么&#xff0c;一些程序员老鸟写一下代码时坚持使用宏呢&#xff1f;带着这样的疑问&#xff0c;下面我将对上面的问题一 一进行解答。 首先想一个问题&#xff1f;如果一个功能&#xff0c;用宏和函数都…

canvas绘制横竖坐标轴(带有箭头和刻度)

查看专栏目录 canvas实例应用100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…