KNN&K-means从入门到实战

news2024/11/18 14:29:29

作者:王同学 来源:投稿
编辑:学姐

1. 基本概念

1.1 KNN

k近邻法(k-nearest neighbor,k-NN)是一种基本分类与回归方法。

k近邻法的输入为实例的特征向量对应于特征空间的点;输出为实例的类别,可以取多类。

k近邻法假设给定一个训练数据集,其中的实例类别已定。分类时,对新的实例,根据其k个最近邻的训练实例的类别,通过多数表决等方式进行预测。因此,k近邻法不具有显式的学习过程。

k 近邻法1968年由Cover和Hart提出。

1.2 K-means

K-means是一种聚类方法,聚类是针对给定的样本,依据它们特征的相似度或距离,将其归并到若干个“类”或“簇”的数据分析问题。

聚类的目的是通过得到的类或簇来发现数据的特点或对数据进行处理。

聚类属于无监督学习,因为只是根据样本的相似度或距离将其进行归类,而类或簇事先并不知道。

1.3 KNN 和 K-means对比

KNN

  • 分类算法

  • 监督学习

  • 数据集是带Label的数据

  • 没有明显的训练过程,基于Memory-based learning

  • K值含义 - 对于一个样本X,要给它分类,首先从数据集中,在X附近找离它最近的K个数据点,将它划分为归属于类别最多的一类

K-means

  • 聚类算法

  • 非监督学习

  • 数据集是无Label,杂乱无章的数据

  • 有明显的训练过程

  • K值含义- K是事先设定的数字,将数据集分为K个簇,需要依靠人的先验知识

2. KNN原理、实现过程

2.1 KKN原理:

KNN算法最简单粗暴的就是将预测点与所有点距离进行计算,然后保存并排序,选出前面K个值看看哪些类别比较多,则预测的点属于哪类。

2 KNN过程:

对未知类别属性的数据集中的每个点依次执行以下操作:

(1) 计算已知类别数据集中的点与当前点之间的距离;

(2) 按照距离递增次序排序;

(3) 选取与当前点距离最小的k个点;

(4) 确定前k个点所在类别的出现频率;

(5) 返回前k个点出现频率最高的类别作为当前点的预测分类

2.2.1 距离度量(1)

2.2.2 K值选择(3)

2.2.2.1 K值选择过小:

  • 如果选择较小的k值,就相当于用较小的邻域中的训练实例进行预测,“学习”的近似误差(approximation error)会减小,只有与输入实例较近的(相似的)训练实例才会对预测结果起作用。

  • 但缺点是“学习”的估计误差(estimation error)会增大,预测结果会对近邻的实例点非常敏感。如果邻近的实例点恰巧是噪声,预测就会出错。

  • 换句话说,k 值的减小就意味着整体模型变得复杂,容易发生过拟合。

2.2.2.2 K值选择过大:

  • 如果选择较大的k值,就相当于用较大邻域中的训练实例进行预测。

  • 优点是可以减少学习的估计误差,但缺点是学习的近似误差会增大。这时与输入实例较远的(不相似的)训练实例也会对预测起作用,使预测发生错误。

  • 换句话说,k值的增大就意味着整体的模型变得简单。

如果k=N,那么无论输入实例是什么,都将简单地预测它属于在训练实例中最多的类。这时,模型过于简单,完全忽略训练实例中的大量有用信息,是不可取的。

2.2.2.3 那么该如何确定K取多少值好呢?

答案是通过交叉验证(将样本数据按照一定比例,拆分出训练用的数据和验证用的数据,比如6:4拆分出部分训练数据和验证数据),从选取一个较小的K值开始,不断增加K的值,然后计算验证集合的方差,最终找到一个比较合适的K值。

2.2.3 确定前k个点所在类别的出现频率(4)

eg.当K取4时候,包含3个红点和1个蓝点

2.2.4 返回前k个点出现频率最高的类别作为当前点的预测分类(5)

因为3/4>1/4,所以预测的点的类别属于红色,KNN完成。

3.K-means原理、实现过程

3.1 K-means原理:

K-Means算法的特点是类别的个数是人为给定的,如果让机器自己去找类别的个数,通过一次次重复这样的选择质心计算距离后分类-再次选择新质心的流程,直到我们分组之后所有的数据都不会再变化了,也就得到了最终的聚合结果。

3.2K-means过程:

(1)随机选取k个质心(k值取决于你想聚成几类)

(2)计算样本到质心的距离,距离质心距离近的归为一类,分为k类

(3)求出分类后的每类的新质心

(4)再次计算计算样本到新质心的距离,距离质心距离近的归为一类

(5)判断新旧聚类是否相同,如果相同就代表已经聚类成功,如果没有就循环2-4步骤直到相同

3.2.1 随机选取k个质心(k值取决于你想聚成几类)

假设我想聚4类,那我们随机选取四个五角星作为质心(大哥)

3.2.2 计算样本到质心的距离,距离质心距离近的归为一类,分为k类

计算除质心外的样本的欧式距离,样本离哪个质心近,该样本就跟哪个质心

换句话说就是,小圆点是小弟,五角星是大哥,小弟离哪个大哥近,那么这个小弟就跟哪个大哥混。

3.2.3 求出分类后的每类的新质心

上面我们已经分为4类了,这一步我们需要从4类中重新选出新的质心(新的大哥)。

3.2.4 再次计算计算样本到新质心的距离,距离质心距离近的归为一类

同样用上面方法计算样本到质心(新产生的大哥)的欧式距离,框起来的就是新大哥。

3.2.5 判断新旧聚类是否相同

当发现聚类情况并没有变化,这就说明我们的计算收敛已经结束了,不需要继续进行分组了,最终数据成功按照相似性分成了4组。即红、橙、绿、蓝,完成聚类。

4.总结:

4.1KNN

  1. k 近邻法是基本且简单的分类与回归方法。k 近邻法的基本做法是∶ 对给定的训练实例点和输入实例点,首先确定输入实例点的k个最近邻训练实例点,然后利用这k个训练实例点的类的多数来预测输入实例点的类。

  2. k 近邻模型对应于基于训练数据集对特征空间的一个划分。k 近邻法中,当训练集、距离度量、k值及分类决策规则确定后,其结果唯一确定。

  3. k 近邻法三要素∶距离度量、k 值的选择和分类决策规则。常用的距离度量是欧氏距离及更一般的L。距离。k值小时,k 近邻模型更复杂;k值大时,k 近邻模型更简单。 k 值的选择反映了对近似误差与估计误差之间的权衡,通常由交叉验证选择最优的k。常用的分类决策规则是多数表决, 对应于经验风险最小化。

  4. k 近邻法的实现需要考虑如何快速搜索k个最近邻点。kd树是一种便于对k 维空间中的数据进行快速检索的数据结构。kd树是二叉树,表示对k维空间的一个划分,其每个结点对应于k维空间划分中的一个超矩形区域。利用kd树可以省去对大部分数据点的搜索,从而减少搜索的计算量。

4.2K-means

  1. 聚类是针对给定的样本,依据它们属性的相似度或距离,将其归并到若干个“类”或“簇”的数据分析问题。一个类是样本的一个子集。直观上,相似的样本聚集在同类,不相似的样本分散在不同类。

  2. 距离或相似度度量在聚类中起着重要作用。 常用的距离度量有闵可夫斯基距离,包括欧氏距离、曼哈顿距离、切比雪夫距离以及马哈拉诺比斯距离。常用的相似度度量有相关系数、夹角余弦。 用距离度量相似度时,距离越小表示样本越相似;用相关系数时,相关系数越大表示样本越相似。

  3. k 均值聚类是常用的聚类算法,有以下特点。基于划分的聚类方法;类别数k 事先指定;以欧氏距离平方表示样本之间的距离或相似度,以中心或样本的均值表示类别;以样本和其所属类的中心之间的距离的总和为优化的目标函数;得到的类别是平坦的、非层次化的;算法是迭代算法,不能保证得到全局最优。

  4. k均值聚类算法,首先选择k个类的中心,将样本分到与中心最近的类中,得到一个聚类结果;然后计算每个类的样本的均值,作为类的新的中心;重复以上步骤,直到收敛为止。

5.代码实战:

5.1 KNN实战:

(1)首先自制一个数据集:

(2)导入工具包

import pandas as pd
from sklearn.neighbors import KNeighborsClassifier  

(3)读取数据

data=pd.read_excel("knndata.xlsx")
data  #打印出来看一下 

(4)划分数据集

train_feature=data.iloc[0:9,1:4]#红色部分
train_label=data.iloc[0:9,4:5]#蓝色部分
test_feature=data.iloc[9:10,1:4]#绿色部分

(5)建模预测

knn=KNeighborsClassifier(n_neighbors=4)#n_neighbors=4即指定K值为4
knn.fit(train_feature,train_label)#模型训练
knn.predict(test_feature)#模型预测

输出:

5.2 K-means代码实战:

(1)自制个数据集

(2)导入工具包

import pandas as pd
from sklearn.cluster import KMeans

(3)读取数据

data=pd.read_excel("kmeans.xlsx")
data#打印看一下

(4)划分数据集

train_feature=data.iloc[0:10,1:4]#红色部分

(5)建模预测

kmeans = KMeans(n_clusters=3)#n_clusters=3即指定划分为3个类型
kmeans.fit(train_feature)#模型训练
label_kmeans = kmeans.predict(train_feature)#模型预测
label_kmeans

输出:

关注下方卡片《学姐带你玩AI》🚀🚀🚀

ACL&CVPR1000+篇论文等你来拿

回复“ACL”或“CVPR”免费领

码字不易,欢迎大家点赞评论收藏!

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

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

相关文章

发布新闻的步骤和技巧

发布新闻是一项非常重要的任务,无论是企业还是个人,都可以通过发布新闻来传达信息和宣传自己。以下是发布新闻的步骤和技巧,帮助你成功发布一条新闻。1、确定新闻的目标受众在发布新闻之前,你需要确定新闻的目标受众。你希望这条新…

多元回归分析 | CNN-GRU卷积门控循环单元多输入单输出预测(Matlab完整程序)

多元回归分析 | CNN-GRU卷积门控循环单元多输入单输出预测(Matlab完整程序) 目录 多元回归分析 | CNN-GRU卷积门控循环单元多输入单输出预测(Matlab完整程序)预测结果评价指标基本介绍程序设计参考资料预测结果 评价指标 训练结束: 已完成最大轮数。 训练集平均绝对误差MAE…

vue3+ts项目采用canvas模拟批注功能

vue3ts项目模拟批注 一、项目需求: 移动端:实现点击“批注”,随手指绘制出线条,线条封闭之后,视为圈记成功,进而输入评论内容——批注; 二、实现思路: 1.“批注”按钮控制canvas画…

关于cFosSpeed如何配置

cFosSpeed配置一、检查Calibration Done情况二、优化Ping时间和线路校准三、测网速四、cFosSpeed控制台五、配置参数一、检查Calibration Done情况 安装完毕,激活成功后。 右键------>选项------>设置, 打开适配器信息,查看Calibra…

leaflet: 一个marker的世界旅行动画(077)

第077个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中动态的设置marker,这里起个美丽的名字就叫做一个marker的世界旅行。 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共76行)相关API参考:专栏目…

内核经典数据结构list 剖析

前言:linux内核中有很多经典的数据结构,list(也称list_head)为其中之一,这些数据结构都是使用C语言实,并且定义和实现都在单独的头文件list.h中。可以随时拿出来使用。list.h的定义不同linux发行版本路径不同,我们可以在/usr/incl…

《python3网络爬虫开发实战 第二版》之基本库的使用-urllib的使用 详解

文章目录1 urllib 库的使用1.1 request模块1.1.1 urlopen类1.1.1.1 最简单的爬虫-爬取百度首页1.1.1.2 urlopen方法的参数1.1.1.2.1 data参数1.1.1.2.2 timeout参数1.1.1.2.3 其他参数1.1.2 Request 类1.1.3 Handler1.2 error模块1.2.1 URLError 类1.2.2 HTTPError类1.2.3 比较…

分布式-分布式服务

微服务API 网关 网关的概念来源于计算机网络,表示不同网络之间的关口。在系统设计中,网关也是一个重要的角色,其中最典型的是各大公司的开放平台,开放平台类网关是企业内部系统对外的统一入口,承担了很多业务&#xf…

【Java】虚拟机JVM

一、运行时数据区域 程序计数器 记录正在执行的虚拟机字节码指令的地址(如果正在执行的是本地方法则为空) Java虚拟机栈 每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息。从方法调用直至执行完成的过程&am…

Mysql数据库的时间(3)一如何用函数插入时间

暂时用下面四个日期函数插入时间 如:insert into Stu(time) values (now()); Mysql的时间函数描述对应的Mysql的时间类型now()/sysdate()NOW()函数以YYYY-MM-DD HH:MM:SS返回当前的日期时间date/time/dateTime/timeStamp/yearcurDate()/current_date()返回当前的日期YYYY-M…

计算机网络笔记(三)—— 数据链路层

数据链路层概述 数据链路层以帧为单位传输数据。 封装成帧:给网络层提供的协议数据单元添加帧头帧尾 差错检测:检错码封装在帧尾 可靠传输:尽管误码不能避免,但如果可以实现发送什么就接受什么,就叫可靠传输 封装成…

RTOS随笔之FreeRTOS启动与同步方法

RTOS启动与同步机制RTOS启动任务切换场景任务同步机制队列信号量事件组任务通知任务延时RTOS启动 FreeRTOS在任务创建完成后调用函数vTaskStartScheduler()启动任务调度器。 vTaskStartScheduler()任务启动函数详解 void vTaskStartScheduler( void ) {BaseType_t xReturn;xR…

项目管理工具dhtmlxGantt甘特图入门教程(九):支持哪些数据格式(下篇)

这篇文章给大家讲解 dhtmlxGantt可以加载或支持哪些数据格式。 dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表,可满足应用程序的所有需求,是最完善的甘特图图表库 DhtmlxGantt正版试用下载(qun:764148812&am…

虚拟机NAT模式无法连外网

虚拟机使用NAT模式连接外网设置时要注意两点 虚拟机的网段要与物理机保持一致各个节点的IP中的GATEWAY要与虚拟机的网关保持一致 1、虚拟机的网段要与物理机保持一致 1.1首先查看物理机的ip,看虚拟机和物理机ip是否在同一网段 winR cmd计入控制台,然…

uni-app前端H5页面底部内容被tabbar遮挡

如果你想在原生 tabbar 上方悬浮一个菜单&#xff0c;之前写 bottom:0。这样的写法编译到 h5 后&#xff0c;这个菜单会和 tabbar 重叠&#xff0c;位于屏幕底部。 原码&#xff1a; <view style"position: fixed;bottom:0;left: 0;background-color: #007AFF;right: …

PythonWeb Django PostgreSQL创建Web项目(二)

安装数据库PostgreSQL并创建数据库 我第一次尝试使用PostgreSQL数据库&#xff0c;why&#xff1f;我喜欢它提供的丰富的数据类型&#xff0c;例如货币类型、枚举类型、几何类型(点、直线、线段、矩形等等)、网络地址类型、文本搜索类型、XML类型JSON类型等等&#xff0c;非常…

Web3中文|聊聊这个让Opensea头疼的新对手Blur ($BLUR)

2022年10月19日&#xff0c;NFT市场迎来一个新的平台。 这个被精心设计的NFT交易市场和聚合器被命名为Blur。 与其他NFT平台不同&#xff0c;Blur旨在提升专业交易者的NFT交易体验。它的开发团队认为其他交易平台存在界面混杂、无法获取分析数据和工具、处理速度缓慢等问题。…

postman使用简介

1、介绍 postman是一款功能强大的网页调试和模拟发送HTTP请求的Chrome插件&#xff0c;支持几乎所有类型的HTTP请求 2、下载及安装 官方文档&#xff1a;https://www.getpostman.com/docs/v6/ chrome插件&#xff1a;chrome浏览器应用商店直接搜索添加即可&#xff08;需墙&…

在魔改PLUS-F5280开发板上使用合封qsp iflash

文章目录引言硬件调整软件调整总结引言 由于目前灵动官网暂未发布正式版的PLUS-F5280开发板&#xff0c;可以使用现有的PLUS-F5270 v1.2开发板&#xff08;下文简称PLUS-F5270开发版&#xff09;替换为MM32F5280微控制器芯片&#xff0c;改装为PLUS-F5280开发板。本文记录了使…

【Mybatis源码解析】mapper实例化及执行流程源码分析

文章目录简介环境搭建源码解析基础环境&#xff1a;JDK17、SpringBoot3.0、mysql5.7 储备知识&#xff1a;《【Spring6源码・AOP】AOP源码解析》、《JDBC详细全解》 简介 基于SpringBoot的Mybatis源码解析&#xff1a; 1.如何对mapper实例化bean 在加载BeanDefinition时&a…