【matlab】KMeans KMeans++实现手写数字聚类
目录
matlab代码kmeans
matlab代码kmeans++
MNIST DATABASE下载网址: http://yann.lecun.com/exdb/mnist/

聚类
将物理或抽象对象的集合分成由类似特征组成的多个类的过程称为聚类(clustering)。
对于给定N个n维向量x1,…,xN∈Rn,聚类的目标就是将这N个n维向量分成k个集合,尽量使得同一个集合中的向量彼此接近,如图2所示。
图2 聚类示意效果图
K-means聚类算法迭代过程
首先初始化聚类中心,如图3所示。
图3 k-means初始聚类中心
然后计算每个点到k个聚类中心的聚类,并将其分配到最近的聚类中心所在的聚类中,重新计算每个聚类现在的质心,并以其作为新的聚类中心,如图4所示。
图4 k-means迭代1次
重复迭代,直到达到给定的迭代次数或k个聚类中心的变化值小于某个阈值,形成最终的聚类结果,如图5所示。
图5 k-means最终聚类效果
K均值聚类算法的复杂度分析
初始化:选择K个初始聚类中心。这个步骤的时间复杂度为O(K)。
分配:对每个样本点,计算其与每个聚类中心的距离,并将其分配到距离最近的聚类中心所代表的簇。这个步骤的时间复杂度为O(N * K * d),其中N是样本数,d是特征数。
更新:对每个簇,计算其所有样本点的平均值作为新的聚类中心。这个步骤的时间复杂度为O(N * K * d)。
重复执行第2和第3步,直到满足停止条件,例如达到最大迭代次数或聚类中心变化小于一定阈值。
因此,K均值聚类算法的总体时间复杂度主要由分配和更新两个步骤决定,为O(T * N * K * d),其中T是迭代次数。
K-means手写数字聚类
用kmeas聚类算法对train_images.mat的前100张和前1000张手写数字图像进行聚类,重复测试10次,每次测试的正确率如图6所示,其中100张的平均正确率为59%,最高正确率为66%,平均运行时间为0.1秒,1000张的平均正确率为55%,最高正确率为62%,平均运行时间为3.6秒。
图6 K-means聚类结果
再对train_images.mat的前100张、500张、1000张、2000张和4000张手写数字图像进行聚类,每种图像张数重复测试10次,计算平均正确率和平均运行时间,结果如表1所示。
表1 K-means聚类测试
由表1可知,K-means手写数字聚类在图像数目达到4000张的时候,运行时间达到了41秒,而且平均正确率为60%左右。
K-means性能分析
由结果可以很明显地看出,K-means聚类应用在手写数字上的效果并不是很好,平均正确率只有60%左右,其中有几个原因。一是K-means假设各个簇的大小、形状和密度相似,如果数据集中的簇具有类似的分布特征,K-means能够产生较好的聚类结果,而手写数字数据集的数字并不是均匀分布的,不同的数字可能出现频率不同,而且手写数字的形状有的区别不大;二是K-means在处理高维数据时可能会遇到困难,因为高维空间下的距离计算和聚类结果评估会变得复杂,而实验中手写数字的维度达到了784。
K-means++
K-means聚类算法的一大缺点是初始类别中心的选择对聚类迭代的次数影响很大,而K-means++是想通过选择更好初始类别中心来减少K-means聚类的迭代次数。
那么什么样的初始类别中心是更好的呢?
好的初始类别中心应该能够均匀地覆盖整个数据空间,能够代表数据集中的不同特征。
K-means++算法流程
- 从数据点中随机选择一个点作为第一个聚类中心。
- 对于每个数据点,计算它与当前已选择的聚类中心的距离,选择与已选择的聚类中心距离最大的数据点作为下一个聚类中心。
- 重复步骤②,直到选择出k个初始聚类中心。
K-means++手写数字聚类
用kmeas++聚类算法对train_images.mat的前100张和前1000张手写数字图像进行聚类,重复测试10次,每次测试的正确率如图7所示,其中100张的平均正确率为58%,最高正确率达到了63%,平均运行时间为0.03秒,1000张的平均正确率为57%,最高正确率为61%,平均运行时间为0.76秒。
图7 K-means++聚类结果
我们再对train_images.mat的前100张、1000张、2000张、4000张和8000张手写数字图像进行聚类,每种图像张数重复测试10次,计算平均正确率和平均运行时间,结果如表2所示。
表2 K-means聚类测试
由表2可知,K-means手写数字聚类在图像数目达到8000张的时候,运行时间达到了15秒,而且平均正确率均高于50%。
K-means++性能分析
由结果可以很明显地看出,相比K-means的聚类结果,K-means++的正确率差别不大,基本上也是在60%左右,但是程序运行时间极大的减少了,这说明K-means++的优化,即选择更好的初始类别中心,可以大大的减少算法迭代的过程,迅速聚类。
但是由于K-means++只是为K-means聚类选择更好的初始化中心,这只是减少了聚类的迭代次数,并不能解决K-means聚类手写数字效果不好的问题。
matlab代码kmeans
clc,clear;
load ./train_images.mat;
load ./train_labels.mat;
k=10;
dimension=2;
Dimension=28*28;
picturesNumber=1000;
sample=train_images(:,:,1:picturesNumber);
sample=reshape(sample,28*28,picturesNumber);
sample=sample';
class=zeros(1,picturesNumber);
times=[];
ratios=[];
for time=1:10tic;classCenter=sample(randperm(picturesNumber,k),:); % 随机取点iterator=0;while(true)iterator=iterator+1;nextCenter=zeros(k,Dimension);classNumber=zeros(1,k);for i=1:picturesNumberdistances=zeros(1,k);for j=1:kdistances(j)=pdist2(sample(i,:),classCenter(j,:));end[~,index]=sort(distances);class(i)=index(1);classNumber(class(i))=classNumber(class(i))+1;nextCenter(class(i),:)=nextCenter(class(i),:)+sample(i,:);endtemp=classCenter;for i=1:kif classNumber(i)~=0classCenter(i,:)=nextCenter(i,:)/classNumber(i);endendif temp==classCenterbreakendendmap=containers.Map('KeyType','int32','ValueType','int32');for i=1:knumber=[];for j=1:picturesNumberif class(j)==inumber=[number,train_labels(j)];endendmap(i)=mode(number);endcount=0;for i=1:picturesNumberif map(class(i))==train_labels(i)count=count+1;endendratio=count/picturesNumber;ratios=[ratios,ratio];times=[times,toc];
end
matlab代码kmeans++
clc;
clear;
load ./train_images.mat;
load ./train_labels.mat;
k = 10;
dimension = 2;
Dimension = 28 * 28;
picturesNumber = 100;
sample = train_images(:, :, 1:picturesNumber);
sample = reshape(sample, 28 * 28, picturesNumber);
sample = sample';
class = zeros(1, picturesNumber);
times = [];
ratios = [];
for time = 1:10tic;% K-Means++ initial center selectionclassCenter = zeros(k, Dimension);classCenter(1, :) = sample(randi(picturesNumber), :);for j = 2:kdistances = pdist2(sample, classCenter(1:j-1, :));minDistances = min(distances, [], 2); % 为什么挑最近的呢?因为是挑离所有已选中心最远的[~, index] = max(minDistances);classCenter(j, :) = sample(index, :);enditerator = 0;while (true)iterator = iterator + 1;nextCenter = zeros(k, Dimension);classNumber = zeros(1, k);for i = 1:picturesNumberdistances = pdist2(sample(i, :), classCenter);[~, index] = min(distances);class(i) = index;classNumber(class(i)) = classNumber(class(i)) + 1;nextCenter(class(i), :) = nextCenter(class(i), :) + sample(i, :);endtemp = classCenter;for i = 1:kif classNumber(i) ~= 0classCenter(i, :) = nextCenter(i, :) / classNumber(i);endendif isequal(temp, classCenter)break;endendmap = containers.Map('KeyType', 'int32', 'ValueType', 'int32');for i = 1:knumber = [];for j = 1:picturesNumberif class(j) == inumber = [number, train_labels(j)];endendmap(i) = mode(number);endcount = 0;for i = 1:picturesNumberif map(class(i)) == train_labels(i)count = count + 1;endendratio = count / picturesNumber;ratios = [ratios, ratio];times = [times, toc];
end
相关文章:
【matlab】KMeans KMeans++实现手写数字聚类
目录 matlab代码kmeans matlab代码kmeans MNIST DATABASE下载网址: http://yann.lecun.com/exdb/mnist/ 聚类 将物理或抽象对象的集合分成由类似特征组成的多个类的过程称为聚类(clustering)。 对于给定N个n维向量x1,…,xN∈Rn,聚类的目标…...
从系统层到应用层,vivo 已在安全生态层
你每隔多久就会使用一次手机?调研结果也许会让你大吃一惊。 权威报告数据显示,2022年,24.9%的受访者每日使用手机时长超过10小时,其中3.8%的受访者“机不离手”,每日使用时长超过15小时。而真正让手机化身为时间吞金兽…...
微信公众号历史文章采集教程思路
大家好,我是淘小白! 今天来说下微信公众号历史记录文章采集的教程和思路,希望能够帮助的到大家~ 1、历史消息入口 现在新版本的微信已经找不到历史记录的入口了,需要对这个入口进行拼接,方法如下: 随便…...
大模型应用--prompt工程实践
在使用大模型进行prompt 训练时,自己做的相关笔记。 本文以openai<1.0版为例。 1.调用大模型 定义调用openai大模型的函数 get_completion() def get_completion(prompt, model"gpt-3.5-turbo"):messages [{"role": "user", …...
新零售时代,传统便利店如何转型?
在零售批发业,如何降低各环节成本、提高业务运转效率、更科学地了解客户服务客户,是每家企业在激烈竞争中需要思考的课题。 对零售批发企业来说,这些问题或许由来已久: (1)如何对各岗位的员工进行科学的考…...
openEuler 系统使用 Docker Compose 容器化部署 Redis Cluster 集群
openEuler 系统使用 Docker Compose 容器化部署 Redis Cluster 集群 Redis 的多种模式Redis-Alone 单机模式Redis 单机模式的优缺点 Redis 高可用集群模式Redis-Master/Slaver 主从模式Redis-Master/Slaver 哨兵模式哨兵模式监控的原理Redis 节点主客观下线标记Redis 节点主客观…...
C# ZXing 二维码,条形码生成与识别
C# ZXing 二维码条形码生成识别 安装ZXing使用ZXing生成条形码生成二维码生成带Logo的二维码识别二维码、条形码 安装ZXing NuGet搜索ZXing安装ZXing.Net包 使用ZXing using ZXing; using ZXing.Common; using ZXing.QrCode; using ZXing.QrCode.Internal; 生成条形码 //…...
[vim]Python编写插件学习笔记1 - 开始
0 环境 Windows 11 22H2gVim82 (D:/ProgramFiles/Vim)Python311 (D:/ProgramFiles/Python311)Vundle v0.10.2 1 Vim 支持 Python gVim82 默认配置中,使用的是 Python3.8。 但我的环境安装的是 Python3.11,且不是安装在默认路径下。虽然添加了 PATH 环…...
深入理解JVM虚拟机第二十篇:静态变量和局部变量的对比以及栈帧对垃圾回收的意义以及JVM中栈帧与堆内对象的应用关系图示
大神链接:作者有幸结识技术大神孙哥为好友,获益匪浅。现在把孙哥视频分享给大家。 孙哥链接:孙哥个人主页 作者简介:一个颜值99分,只比孙哥差一点的程序员 本专栏简介:话不多说,让我们一起干翻JVM 本文章简介:话不多说,让我们讲清楚静态变量和局部变量的对比 文章目录…...
【计算机网络基础实验】实验二 有线IP互通网络实践
任务一 IP路由协议实现企业路由器通信 目录如下: 任务一 IP路由协议实现企业路由器通信2.1.1 任务描述2.1.2 任务目的2.1.3 任务实施实验需求实验步骤步骤1:更改每台设备的名称步骤2: 给R1接口配置相应IP地址步骤3: 给R2接口配置相…...
【Orangepi Zero2 全志H616】驱动串口实现Tik Tok—VUI(语音交互)
一、编程实现语音和开发板通信 wiringpi库源码demo.c 二、基于前面串口的代码修改实现 uartTool.huartTool.cuartTest.c 三、ADB adb控制指令 四、手机接入Linux热拔插相关 a. 把手机接入开发板 b. 安装adb工具,在终端输入adb安装指令: sudo apt-g…...
【Spring】静态代理
例子: 租房子 角色: 我 (I ) 中介( Proxy ) 房东( host ) Rent 接口 package org.example;public interface Rent {void rent(); }房东 package org.example;public class Host implements Rent{Overridepublic void rent() …...
tomcat web.xml文件中servlet的load-on-startup
先看一个例子: <servlet><description>JAX-WS endpoint - restful</description><display-name>restful</display-name><servlet-name>restful-addnumbers</servlet-name><servlet-class>com.sun.xml.ws.transpor…...
记chrome打不开网址,无法搜索问题
打开网址解决办法 2023关于chrome谷歌浏览器无法正常上网问题,解决办法,亲测有效 下载插件,解压后拖入chrome的扩展程序中,可以打开国内网址 google引擎搜索解决办法 打开无痕浏览 (不知道什么原理,可…...
Spring面试题:(五)Spring注解开发@Component,@Autowired,@Bean,@Configuration
Bean基本注解 spring提供注解的版本 Component注解替代bean标签 bean其它属性的相关注解: scope 替代scopelazy 替代lazy-initPostConstruct 替代init-methodPreDestroy 替代destroy-method 使用Component注解的前提是开启注解扫描 衍生注解Repository,Servi…...
【Qt-23】ui界面设计-ToolBar
1、ToolBar 右击主窗体添加工具栏 新建动作,可设置图标,图标有本地文件和资源两种方式。 修改toolButtonStyle的属性,可设置图标与汉字显示的方式。 页面跳转: connect(ui->action, SIGNAL(triggered()), this, SLOT(openWid…...
nodejs 异步架构
nodejs的核心之一就是非阻塞的异步IO,于是想知道它是怎么实现的,挖了下nodejs源码,找到些答案,在此跟大家分享下。首先,我用了一段js代码test-fs-read.js做测试,代码如下: var path require(pa…...
腾讯云优惠券介绍、作用、领取方法及使用教程
随着云计算技术的发展,越来越多的企业和个人选择使用云服务进行数据存储、计算等业务。腾讯云作为国内知名的云服务商,提供了一整套完善的云解决方案,并不定期发放优惠券以吸引更多的客户。本文将为大家详细介绍腾讯云优惠券的作用、领取方法…...
浅谈智能变电站自动化系统的应用与产品选型
安科瑞电气股份有限公司 上海嘉定 201801 摘要:现如今,智能变电站发展已经成为了电力系统发展过程中的内容,如何提高智能变电站的运行效率也成为电力系统发展的一个重要目标,为了能够更好地促进电力系统安全稳定运行,…...
适用于初学者的 .NET MAUI
适用于初学者的 .NET MAUI | Microsoft Learn 记录微软Learn中用到的代码。文章比较粗糙,大部分是项目代码粘贴。想详细学习的可到上面的链接学习,代码可以从这里复制后直接运行。 练习中一共有两个页面: 1、MainPage.xaml 用于添加列表中的…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
Modbus RTU与Modbus TCP详解指南
目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...
