【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 用于添加列表中的…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...
DAY 26 函数专题1
函数定义与参数知识点回顾:1. 函数的定义2. 变量作用域:局部变量和全局变量3. 函数的参数类型:位置参数、默认参数、不定参数4. 传递参数的手段:关键词参数5 题目1:计算圆的面积 任务: 编写一…...
flow_controllers
关键点: 流控制器类型: 同步(Sync):发布操作会阻塞,直到数据被确认发送。异步(Async):发布操作非阻塞,数据发送由后台线程处理。纯同步(PureSync…...
【Ftrace 专栏】Ftrace 参考博文
ftrace、perf、bcc、bpftrace、ply、simple_perf的使用Ftrace 基本用法Linux 利用 ftrace 分析内核调用如何利用ftrace精确跟踪特定进程调度信息使用 ftrace 进行追踪延迟Linux-培训笔记-ftracehttps://www.kernel.org/doc/html/v4.18/trace/events.htmlhttps://blog.csdn.net/…...

EEG-fNIRS联合成像在跨频率耦合研究中的创新应用
摘要 神经影像技术对医学科学产生了深远的影响,推动了许多神经系统疾病研究的进展并改善了其诊断方法。在此背景下,基于神经血管耦合现象的多模态神经影像方法,通过融合各自优势来提供有关大脑皮层神经活动的互补信息。在这里,本研…...