手把手教你实现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,一经查实,立即删除!

相关文章

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

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

牛客网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;重复的结点也必须记…

深度学习(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.…

NC6X单点登录设计文档说明

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

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

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

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…

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

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

[项目管理] 如何使用git客户端管理gitee的私有仓库

最近发现即使翻墙也无法g使用ithub了&#xff0c;需要把本地的项目搬迁到新的git托管平台。 gitee 是一个国内开源项目托管平台&#xff0c;是开源开发者、团队、个人进行 git 代码管理和协作的首选平台之一。本文将详细介绍如何向 gitee 提交私有项目。 注册 Gitee 账号并创建…

P3372 【模板】线段树 1

网址如下&#xff1a; P3372 【模板】线段树 1 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题如其名 昨天做了一道开关&#xff08;也是线段树的&#xff09; 想着今天复习一下 代码如下&#xff1a; #include<iostream> using namespace std; typedef long long…

golang 引入swagger(iris、gin)

golang 引入swagger&#xff08;iris、gin&#xff09; 在开发过程中&#xff0c;我们不免需要调试我们的接口&#xff0c;但是有些接口测试工具无法根据我们的接口变化而动态变化。文档和代码是分离的。总是出现文档和代码不同步的情况。这个时候就可以在我们项目中引入swagge…

【漏洞复现】多语言药房管理系统MPMS文件上传漏洞

Nx01 产品简介 多语言药房管理系统 (MPMS) 是用 PHP 和 MySQL 开发的, 该软件的主要目的是在药房和客户之间提供一套接口&#xff0c;客户是该软件的主要用户。该软件有助于为药房业务创建一个综合数据库&#xff0c;并根据到期、产品等各种参数提供各种报告。 Nx02 漏洞描述 …

显示器颜色显示技术原理

此图片来源于网络 1、人眼是如何看到颜色的 以下介绍如何定义颜色的基本知识。首先人眼是如何看到颜色的。可见光的光谱范围从380纳米到750纳米。在此范围内&#xff0c;可以看到每种可见颜色的相应波长。将讨论如何将可见光谱的波长组合成其他颜色&#xff0c;以及这一过程是…

2023年12月 Python(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,共50分) 第1题 一个非零的二进制正整数,在其末尾添加两个“0”,则该新数将是原数的?( ) A:10倍 B:2倍 C:4倍 D:8倍 答案:C 二进制进位规则是逢二进一,因此末尾添加一个0,是扩大2倍,添加两个0…

postman执行批量测试

1.背景 有许多的人常常需要使用第三方系统进行重复的数据查询&#xff0c;本文介绍使用PostMan的方式对数据进行批量的查询&#xff0c;减少重复的劳动。 2.工具下载 3.初入门 一、如图示进行点击&#xff0c;创建collection 二、输入对应的名称 三、创建Request并进行查…

C++后端开发之Sylar学习二:配置VSCode远程连接Ubuntu开发

C后端开发之Sylar学习二&#xff1a;配置VSCode远程连接Ubuntu开发 没错&#xff0c;我不能像大佬那样直接在Ubuntu上面用Vim手搓代码&#xff0c;只能在本地配置一下VSCode远程连接Ubuntu进行开发咯&#xff01; 本篇主要是讲解了VSCode如何配置ssh连接Ubuntu&#xff0c;还有…