K最近邻算法

一、近朱者赤,近墨者黑

通常称对门、楼上、楼下和隔壁均是我们的邻居。为什么呢?离得近呗。 “近朱者赤近墨者黑”“昔孟母,择邻处”等充分说明了邻居对我们的重要性。基本上你的邻居是什么人,你也是什么人。假如你楼上是马云,楼下是马化腾,那你肯定也是亿万富翁,否则也买不起那里的房子。
2020年7月份,我校网站、中国教育在线等各大网站都在发送下面这条新闻:
stu在这里插入图片描述
2020年7月份,南阳理工学院信息工程学院2016级考研学子喜讯频传,其中一男生宿舍6名同学全部收到了研究生录取通知书。
在青年公寓B205宿舍里,住着2016级光电信息科学与工程专业6位男生,在硕士研究生考试中,以优异成绩全部被录取。他们的考取学校分别是:马凤阳,复旦大学;王玉杰,四川大学;梁瑞,中国海洋大学;张志鹏,华南师范大学;梁爱杰,暨南大学;陈林,深圳大学。
谈起考研,6位男生都有不一样的想法,但是他们的目标都一致。梁瑞说经过大学四年的学习,对本专业产生浓厚的兴趣,想要更加深入的学习与研究。考研是一场孤独的旅行,在这场旅行中,有艰辛,有磨练,更有对未来的憧憬和期待……马凤阳和张志鹏等6名同学每天早上6:30准时起床去教室学习,晚上十点多回寝室,在备考过程中难免会有厌倦、烦躁、焦虑,但他们相互鼓励,继续努力奋斗……

算法简介

  1. KNN算法的全称是K-Nearest Neighbor,即k最近邻,由Cover和Hart在1968年提出。
  2. K指的是最近邻的个数,K最近邻指的是离你最近的k个邻居。显然,当K=1,3,5等不同值时,最近邻是不同的。
  3. 该算法是监督学习算法,适用于分类和回归任务。
  4. 通过测量不同样本的特征值之间的距离来寻找最近的K个邻居,然后根据这些邻居的信息来预测目标变量。如果A最亲近的几个好友人品都不错,那么可预测A的人品也不错(分类);也可根据A几个好友的收入来预测A的收入(回归)。
  5. 在分类任务中,算法会查找距离待预测样本最近的K个邻居,然后根据这些邻居的类别,通过多数投票机制确定待预测样本的类别。在回归任务中,算法同样查找距离待预测样本最近的K个邻居,但是它会计算这些邻居的目标变量的平均值(或中位数),并将此值作为预测结果。
    在这里插入图片描述
    显然,当K=1和K=5时,绿色点的最近邻是不同的。

算法的核心

核心1:如何确定最近邻?

可计算样本间的距离或相似度,用距离或相似度来衡量样本之间的差异。
常用的计算距离的公式有:欧氏距离、曼哈顿距离、和闵可夫斯基距离等。
常用的计算相似度的公式有:余弦相似度、皮尔逊相关系数等。例如常见的推荐系统,即通过计算目标用户与其他用户之间的相似度,找到与目标用户最相似的K个用户,然后根据这K个用户的喜好来为目标用户推荐物品。
选择距离度量的方式需要考虑到数据的特点和实际问题的需求。例如,欧氏距离适用于大多数场景,但在某些特征有不同权重的情况下,可能需要考虑加权欧氏距离;曼哈顿距离在城市街区距离计算中有应用,而切比雪夫距离在国际象棋中计算国王的移动距离时使用。如果数据中包含许多0值,那么使用余弦相似度可能更合适。如果特征值差异较大,可能需要考虑归一化后的欧氏距离或曼哈顿距离。

核心2:如何确定K值?

K值的选择会极大影响K近邻的结果。试想一下:如果K=1或者K=样本总数,预测结果会怎样?
K值的确定方法:经验值、交叉验证方法(通过模型在验证集上的表现来选择最佳的k值)等。此外,K值最好为奇数。

标题KNN是如何解决分类和回归问题的?

在分类任务中,算法会查找距离待预测样本最近的K个邻居,然后根据这些邻居的类别,通过多数投票机制确定待预测样本的类别。观察下图,想想绿色点的类别应为红色还是蓝色?
在这里插入图片描述
如果按照投票的方式,应该分为蓝色类别,但从距离上看,样本距离红色类别更近,划为红色似乎更加合理,这里就需要引入距离权重的概念。
在KNeighborsClassifier中有一个参数weight,不指定该参数的情况下默认为uniform也就是多数投票,也可以指定weight为distance,即可采用距离权重的方式进行分类。
此外,在回归任务中,算法同样查找距离待预测样本最近的K个邻居,但是它会计算这些邻居的目标变量的平均值(或中位数),并将此值作为预测结果。

实战

步骤1:导入所需包库

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split,cross_val_score
from sklearn.neighbors import KNeighborsClassifier

步骤2:导入数据集,提取特征和标签

iris=load_iris( )
X=iris[‘data’]
y=iris[‘target’]

步骤3:训练集和测试集的划分

X_train,X_test,y_train,y_test=train_test_split(X,yrandom_state=1)

步骤4:创建KNN分类器实例,设置不同的k值进行交叉验证测试

k_values = [1, 3, 5, 7, 9]
accuracies = [ ]

for k in k_values:
knn = KNeighborsClassifier(n_neighbors=k)
scores = cross_val_score(knn, X_train, y_train, cv=5, scoring=‘accuracy’)
accuracies.append(scores.mean())

步骤5:找出最佳k值

best_k = k_values[accuracies.index(max(accuracies))]
print(f"最佳k值为: {best_k}")

步骤6:用最佳K值来训练模型,并在测试集上进行预测

knn=KNeighborsClassifier(n_neighbors=best_k)
knn.fit(X_train,y_train)
knn.score(X_test,y_test)

步骤7:模型用于预测新样本的类别

X_new=[[1.2,3.4,5,3.8]] #假设获得的一个新样本
print(knn.predict(X_new))
print(knn.predict_proba(X_new))
print(knn.classes_)
print(iris.target_names[knn.predict(X_new)])
运行结果:
在这里插入图片描述

KNeighborsClassifier详解

KNeighborsClassifier(n_neighbors=5, weights=‘uniform’, algorithm=‘auto’, leaf_size=30, p=2, metric=‘minkowski’, metric_params=None, n_jobs=1, **kwargs)
主要参数见下表:

参数含义
n_neighbors最近邻个数K。 整数,默认为5
weights权重,默认为’uniform’:即样本权重相等, ‘distance‘:’权重为距离的倒数
algorithm用于计算最近邻的算法,有ball_tree、kd_tree、brute、auto
leaf_sizeBallTree或KDTree叶子节点个数,默认为30
p默认为2。当p=2,欧式距离;p=1,曼哈顿距离

拓展

1.利用KD树来找最近邻
from sklearn.neighbors import KDTree
#构建KD树
tree = KDTree(X_train, leaf_size=40, metric=‘minkowski’)
#查询最近邻居
distances, indices = tree.query(X_test, k=5)
#输出最近的5个邻居的距离和索引
print(“邻居距离:”)
print(distances)
print(“邻居索引:”)
print(indices)
2. 利用BallTree来找最近邻(KD树的变种,适用于不同形状的数据分布)
from sklearn.neighbors import BallTree

构建球树

ball_tree = BallTree(X_train, leaf_size=40, metric=‘minkowski’)

查询最近邻居

distances, indices = ball_tree.query(X_test, k=5)

输出最近的5个邻居的距离和索引

print(“邻居距离:”)
print(distances)
print(“邻居索引:”)
print(indices)
参考链接:https://blog.csdn.net/weixin_36431814/article/details/142418794

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

操作系统期末|考研复习知识点汇总 - 持续更新

本文将根据个人学习进度对b站王道408课程以及题目考察的知识点进行整合,视频中详细的导图将会直接复用,并且将会对一些重点知识进行扩展以及一些思维导图的补充,目前第三章内容正在整理中…… 一:计算机系统概述 1.1操作系统概念…

DockerCompose快速部署Java项目、nginx前端和mysql数据库到centos虚拟机

简介:整理自:SpringCloud微服务开发与实战,java黑马商城项目微服务实战开发(涵盖MybatisPlus、Docker、MQ、ES、Redis高级等)课程的飞书文档。 DockerCompose介绍 大家可以看到,我们部署一个简单的java项…

实现可扩展人工智能的便捷之路:英特尔 Tiber 开发者云 + MinIO 对象存储

当今组织在 AI 和数据管理方面面临的最大挑战之一是获得可靠的基础设施和计算资源。英特尔 Tiber 开发人员云专为需要概念验证、实验、模型训练和服务部署环境的工程师而构建。与其他难以接近且复杂的云不同,英特尔 Tiber 开发人员云简单易用。该平台对于开发各种类…

信息安全工程师(67)网络流量清洗技术与应用

前言 网络流量清洗技术是现代网络安全领域中的一项关键技术,它主要用于过滤和清理网络流量中的恶意部分,确保正常的网络通信。 一、网络流量清洗技术的定义与原理 网络流量清洗技术,也称为流量清理(Traffic Scrubbing)…

csdn要打开或者无法刷新内容管理,文章无法发布或者未保存成功(服务器超时)-->先保存在自己的电脑里

今天突然想到以前看网页小说的时候改变网页链接后面的页数能够直接跳转,那么能不能不能改一下1000.2115.3001.5448 https://mp.csdn.net/mp_blog/manage/article?spm1000.2115.3001.5448 https://mp.csdn.net/mp_blog/manage/article?spm1000.2115.3001.5448 后…

计算机使用梯子后关机,再次使用计算机时未开启梯子,无法正常上网

问题:使用计算机时开启了梯子,使用完毕后关闭计算机,再次打开计算机但是没有开启梯子时无法正常上网; 原因:使用梯子时可能将手动设置代理处设置成了梯子的代理服务器地址,所以再次使用计算机但是没有使用…

报表系统-连接数据库操作

本专栏用于解析自己开源的项目代码,作为复盘和学习使用。欢迎大家一起交流 本样例说明源码开源在: ruoyi-reoprt gitee仓库 ruoyi-report github仓库 欢迎大家到到项目中多给点star支持,对项目有建议或者有想要了解的欢迎一起讨论 连接数据库…

初学者指南:软件测试

目录 初学者软件开发流程中的测试指南一、什么是软件测试?二、软件测试的重要性三、软件测试的类型四、软件测试的流程五、软件测试工具六、软件测试工程师的技能要求七、如何上手软件测试八、结语 初学者软件开发流程中的测试指南 欢迎来到软件测试的世界&#xf…

公司章程拟定,定制公司章程

公司章程是指公司依法制定的、规定公司名称、住所、经营范围、经营管理制度等重大事项的基本文件,也是公司必要的规定公司组织及活动基本规则的书面文件。公司章程是股东共同一致的意思表示,载明了公司组织和活动的基本准则,是公司的宪章。关…

基于HEC-Ras及ArcGIS的泥石流数值模拟与灾害风险评估典型案例

泥石流是一种破坏性极强的自然灾害,对人类社会和自然环境都构成了巨大的威胁。由于泥石流的发生通常突然且难以预测,因此,采取有效的预防措施和进行科学的风险评估显得尤为重要。为了减少泥石流可能带来的损害,可以建立高效的监测…

LVGL第二篇-组件创建与显示(以slider为例)

一、LVGL 中组件加载步骤 分配内存与初始化: 首先,通过调用相应组件的创建函数来分配内存并初始化组件对象。例如,若要创建一个按钮组件,可使用lv_XXX_create函数。这些创建函数会返回一个指向新创建组件对象(lv_obj_t…

百度文心一言接入流程-java版

百度文心一言接入流程-java版 一、准备工作二、API接口调用-java三、百度Prompt工程参考资料: 百度文心一言:https://yiyan.baidu.com/百度千帆大模型:https://qianfan.cloud.baidu.com/百度千帆大模型文档:https://cloud.baidu.com/doc/WENXINWORKSHOP/index.html千tokens…

Modbus TCP报错:Response length is only 0 bytes

问题描述: 使用modbus_tk库,通过Modbus tcp连接PLC时,python中的一个报错信息: Response length is only 0 bytes报错原因: 与Modbus TCP 服务端建立连接后没有断开,继续作为长连接使用,客户端…

时序数据库 TDengine 支持集成开源的物联网平台 ThingsBoard

Thingsboard 中“设备配置”和“设备”的关系是一对多的关系,通过设备配置为每个设备设置不同的配置,每个设备都会有一个与其关联的设备配置文件。等等,这不就是TDengine 中超级表的概念: 超级表是一种特殊的表结构,用…

Unity3D学习FPS游戏(4)重力模拟和角色跳跃

前言:前面两篇文章,已经实现了角色的移动和视角转动,但是角色并没有办法跳跃,有时候还会随着视角移动跑到天上。这是因为缺少重力系统,本篇将实现重力和角色跳跃功能。觉得有帮助的话可以点赞收藏支持一下!…

Spring Cloud:构建高可用分布式系统的利器

摘要:本文将介绍Spring Cloud,一个基于Spring Boot的开源微服务架构工具集。我们将探讨Spring Cloud的核心组件、特性以及如何使用Spring Cloud构建高可用、分布式系统。通过本文,读者将了解到Spring Cloud在实现微服务架构中的应用和优势。 …

ResNet-RS 乳腺癌识别

一、模型结构 1.1 模型思路 ResNet-RS是一种改进的ResNet架构,它在2021年由谷歌大脑和UC Berkeley的研究者们提出。ResNet-RS的提出基于对现有ResNet架构的深入研究,研究者们重新审视了ResNet的结构、训练方法以及缩放策略,并提出了一些改进…

git入门操作(2)

文章目录 git入门操作(2)git diff 查看差异git diff gitignore忽略文件1.在代码仓库创建这个文件2.添加对 log 文件过滤 连接远程仓库与ssh配置远程仓库和本地仓库关联步骤分支基本操作步骤命令: 合并冲突分支合并逻辑1.新建分支 dev&#xf…

MySQL查看当前客户端连接数的方法

每当有客户端连接到 MySQL 时,MySQL 会为该连接创建一个新的线程来处理所有与该连接相关的查询和操作。所以通过查看MySQL当前的连接线程数量就可以知道有多少客户端连接到MySQL。 方法一 Threads_connected 仅显示活跃的客户端连接数 SHOW STATUS LIKE Threads_…

H7-TOOL的LUA小程序教程第15期:电压,电流,NTC热敏电阻以及4-20mA输入(2024-10-21,已经发布)

LUA脚本的好处是用户可以根据自己注册的一批API(当前TOOL已经提供了几百个函数供大家使用),实现各种小程序,不再限制Flash里面已经下载的程序,就跟手机安装APP差不多,所以在H7-TOOL里面被广泛使用&#xff…