【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 用于添加列表中的…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
