人工智能|机器学习——k-近邻算法(KNN分类算法)

1.简介

 k-最近邻算法,也称为 kNNk-NN,是一种非参数、有监督的学习分类器,它使用邻近度对单个数据点的分组进行分类或预测。虽然它可以用于回归问题,但它通常用作分类算法,假设可以在彼此附近找到相似点。

对于分类问题,根据比重分配类别标签,即使用在给定数据点周围最多表示的标签。虽然这在技术上被认为是plurality voting(多数表决),但majority vote一词在书面语中更常用。这些术语之间的区别在于,majority voting在技术上需要超过 50% ,这主要适用于只有两个类别的情况。当您有多个类别时 - 例如四个类别,您不一定需要 50% 才能对一个类别做出结论;您可以分配一个占比超过 25% 的类别标签。Wisconsin-Madison大学用了一个例子很好地总结了这一点。

回归问题使用与分类问题类似的概念,但在这种情况下,取 k 个最近邻的平均值来对分类进行预测。主要区别是分类用于离散值,而回归用于连续值。但是,在进行分类之前,必须定义距离。欧几里得距离是最常用的,我们将在下面深入研究。

值得注意的是,kNN 算法也是lazy learning模型家族的一部分,这意味着所有计算都发生在进行分类或预测时。由于它严重依赖内存来存储其所有训练数据,因此也称为基于实例或基于内存的学习方法。

Evelyn Fix 和 Joseph Hodges 在 1951 年的这篇论文中提出了围绕 kNN 模型的最初想法,而 Thomas Cover 在他的研究中扩展了他们的概念,“Nearest Neighbor Pattern Classification”。虽然它不像以前那么受欢迎,但由于其简单性和准确性,它仍然是人们在数据科学中学习的首批算法之一。然而,随着数据集的增长,kNN 变得越来越低效,影响了模型的整体性能。它通常用于简单的推荐系统、模式识别、数据挖掘、金融市场预测、入侵检测等。

2. 距离度量

kNN距离指标计算

回顾一下,k-最近邻算法的目标是识别给定查询点的最近邻,以便我们可以为该点分配一个类标签。为了做到这一点,kNN 有几个要求:

  • 确定距离度量

为了确定哪些数据点最接近给定查询点,需要计算查询点与其他数据点之间的距离。这些距离度量有助于形成决策边界,将查询点划分为不同的区域。您通常会看到使用 Voronoi 图可视化的决策边界。

虽然您可以选择多种距离度量,但本文仅涵盖以下内容:

欧几里得距离(p=2):这是最常用的距离度量,仅限于实值( real-valued )向量。使用下面的公式,它测量查询点和被测量的另一个点之间的直线。

曼哈顿距离(p=1):这也是另一种流行的距离度量,它测量两点之间的绝对值。它也被称为出租车(taxicab)距离或城市街区(city block)距离,因为它通常用网格可视化,说明人们如何通过城市街道从一个地址导航到另一个地址。

闵可夫斯基(Minkowski)距离:该距离度量是欧几里得和曼哈顿距离度量的广义形式。下面公式中的参数 p 允许创建其他距离度量。当 p 等于 2 时,这个公式表示欧几里得距离,p 等于 1 表示曼哈顿距离 。

汉明(Hamming)距离:这种技术通常与布尔或字符串向量一起使用,识别向量不匹配的点。因此,它也被称为重叠度量。可以用以下公式表示:

例如,如果您有以下字符串,Hamming距离将为 2,因为只有两个值不同。

3.K的选择

k-NN 算法中的 k 值定义了将检查多少个邻居以确定查询点的分类。例如,如果 k=1,实例将被分配到与其单个最近邻相同的类。定义 k 是一种平衡行为,因为不同的值可能会导致过拟合或欠拟合。

  • 较低的 k 值可能具有较高的方差,但较低的偏差,较大的 k 值可能导致较高的偏差和较低的方差。
  • k 的选择将很大程度上取决于输入数据,因为有许多异常值或噪声的数据可能会在 k 值较高时表现更好。总之,建议 k 使用奇数以避免分类歧义,交叉验证策略可以帮助您为数据集选择最佳 k。

4.K-近邻算法伪代码:

①计算已知类别数据集中的点与当前点之间的距离

②按照距离递增次序排序

③选择与当前点距离最小的k个点

④确定前k个点所在类别(标签)的出现频率

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

5.K-近邻算法程序清单:

希望深入研究,可以通过使用Pythonscikit-learn 来了解有关 k-NN 算法的更多信息。以下代码是如何使用 kNN 模型创建和预测的示例:

from sklearn.neighbors import KNeighborsClassifier

model_name = ‘K-Nearest Neighbor Classifier’

`kNN`Classifier = KNeighborsClassifier(n_neighbors = 5, metric = ‘minkowski’, p=2)

`kNN`_model = Pipeline(steps=[(‘preprocessor’, preprocessorForFeatures), (‘classifier’ , `kNN`Classifier)])

`kNN`_model.fit(X_train, y_train)

y_pred = `kNN`_model.predict(X_test)

6. 应用

k-NN 算法已在各种问题中得到应用,主要是在分类中。其中一些用例包括:

  • 数据预处理

数据集经常有缺失值,但 kNN 算法可以在缺失数据插补的过程中估计这些值。

  • 推荐问题

使用来自网站的clickstream(点击流)数据,kNN 算法已用于向用户提供有关其他内容的自动推荐。这项研究表明,用户被分配到特定组,并根据该组的用户行为,为他们提供推荐。然而,考虑到 kNN 的应用规模,这种方法对于较大的数据集可能不是最优的。

  • 金融

它还用于各种金融和经济用例。例如,一篇论文展示了如何在信用数据上使用 kNN 可以帮助银行评估向组织或个人提供贷款的风险。它用于确定贷款申请人的信用状况。

  • 生命健康

kNN 还应用于医疗保健行业,预测心脏病发作和前列腺癌的风险。该算法通过计算基因的表达来工作。

  • 模式识别

kNN 还有助于识别模式,例如文本和数字分类。这对于识别在表格或邮寄信封上的手写数字特别有帮助。

7. 优缺点

就像任何机器学习算法一样,k-NN 也有其优点和缺点。根据实际情况,它可能是也可能不是最优的选择。

7.1. 优势

  • 易于实现

鉴于算法的简单性和准确性,它是新数据科学家将学习的首批分类器之一。

  • 适应性强

随着新训练样本的添加,算法会根据任何新数据进行调整,因为所有训练数据都存储在内存中。

  • 超参数少:

kNN 只需要一个 k 值和一个距离度量,与其他机器学习算法相比,参数是很少的。

7.2. 不足

  • 数据规模

由于 kNN 是一种惰性算法,与其他分类器相比,它占用了更多的内存和数据存储。从时间和金钱的角度来看,这可能是昂贵的。更多的内存和存储将增加业务开支,而更多的数据可能需要更长的时间来计算。虽然已经创建了不同的数据结构(例如 Ball-Tree)来解决计算效率低下的问题,但根据业务问题,采用其他的分类器可能更好。

  • 维度

kNN 算法往往会成为维度灾难的受害者,这意味着它在高维数据输入时表现不佳。这有时也称为峰值现象,在算法达到最佳特征数量后,额外的特征会增加分类错误的数量,尤其是当样本尺寸更小。

  • 过拟合

由于“curse of dimensionality”(维度灾难),kNN 更容易出现过拟合。虽然利用特征选择和降维技术可以防止这种情况发生,但 k 的值也会影响模型的行为。较低的 k 值可能会过度拟合数据,而较高的 k 值往往会“平滑”预测值,因为它是对更大区域或邻域的值进行平均。但是,k 值太高,模型可能会欠拟合。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

灵魂指针,教给(二)

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看,已成习惯 创作不易,多多支持! 目录 一、数组名的理解 二、使用指针访问数组 三、一维数组传参本质 四、冒泡排序 五、二级指针 六、指针数组 七、指针数组…

Go语言物联网开发安科瑞ADW300/4G电能表数据上传mqtt平台-电表接线到传输数据完整流程

电能表功能说明 ADW300是方便用户进行用电监测、集抄和管理,可灵活安装在配电箱中,可用于电力运维、环保监管等在线监测类平台中。我们本案例是用于工业售电公司对出售电的管理,设备可以监控用电情况、故障监控及警报,售电公司可…

LeetCode的使用方法

LeetCode的使用方法 一、LeetCode是什么?1.LeetCode简介2.LeetCode官网 二、LeetCode的使用方法1.注册账号2.力扣社区力扣编辑器 2.1 讨论发起讨论参与讨论关注讨论 2.2 文章撰写文章关注文章 3.力扣面试官版测评面试招聘竞赛 4.力扣学习LeetBook 书架我的阅读猜您喜…

使用Opencv库直接进行人脸检测

import cv2abs_path cv2.__file__ xml_path abs_path.rsplit("/",1)[0] "/data/haarcascade_frontalface_default.xml"# 加载人脸检测器 face_cascade cv2.CascadeClassifier(xml_path)# 加载图像 img cv2.imread(/media/datasets/face/liuyigei_duo.…

C++vector的使用方法

文章目录 一、vector的介绍1. 文档链接2. 简要介绍 二、vector的使用1.vector的定义(1)构造函数(2)拷贝构造函数(2)赋值重载 2. vector 增删查改(1)operator [](2&#x…

地址分词 | EXCEL批量进行地址分词,标准化为十一级地址

一 需求 物流需要对用户输入地址进行检查,受用户录入习惯地址可能存在多种问题。 地址标准化是基于地址引擎和地址大数据模型,自动将地址信息标准化为省、市、区市县、街镇、小区、楼栋、单元、楼层、房屋、房间等元素,补充层级缺失数据、构建…

C语言从入门到精通 第十一章(文件操作)

写在前面: 本系列专栏主要介绍C语言的相关知识,思路以下面的参考链接教程为主,大部分笔记也出自该教程。除了参考下面的链接教程以外,笔者还参考了其它的一些C语言教材,笔者认为重要的部分大多都会用粗体标注&#xf…

【学习笔记】微信运营工具

办公工具 在线 http://uzer.meMindMaster即刻(APP)收趣(APP)MindMaster(app) 安装 文字工具 Mega Emoji 文字云 石墨文档 giftools 音频工具 变声实验室(APP) 录音APP&am…

本鲸多方位助力创业者高效对接创新创业机遇

在科技创新的浪潮中,创业者们不断探索着新的商业机会,寻求着创新创业的道路。然而,面对复杂多变的市场环境和激烈的竞争压力,如何高效对接创新创业机遇成为了摆在创业者面前的重要课题。 本鲸依托海南本鲸投资有限公司和重庆本鲸…

Flink 物理执行图

文章目录 物理执行图一、Task二、ResultPartition三、ResultSubpartition四、InputGate五、InputChannel 物理执行图 JobManager根据ExecutionGraph对作业进行调度,并在各个TaskManager上部署任务。这些任务在TaskManager上的实际执行过程就形成了物理执行图。物理…

Leetcode - 周赛387

目录 一,3069. 将元素分配到两个数组中 I 二,3070. 元素和小于等于 k 的子矩阵的数目 三,3071. 在矩阵上写出字母 Y 所需的最少操作次数 四,3072. 将元素分配到两个数组中 II 一,3069. 将元素分配到两个数组中 I 本…

[递归、搜索、回溯]----递归

前言 作者:小蜗牛向前冲 专栏:小蜗牛算法之路 专栏介绍:"蜗牛之道,攀登大厂高峰,让我们携手学习算法。在这个专栏中,将涵盖动态规划、贪心算法、回溯等高阶技巧,不定期为你奉上基础数据结构…

freeRTOS20240308

1.总结任务的调度算法,把实现代码再写一下 2.总结任务的状态以及是怎么样进行转换的

音视频学习笔记——c++多线程(一)

✊✊✊&#x1f308;大家好&#xff01;本篇文章主要整理了部分多线程相关的内容重点&#x1f607;。首先讲解了多进程和多线程并发的区别以及各自优缺点&#xff0c;之后讲解了Thead线程库的基本使用。 本专栏知识点是通过<零声教育>的音视频流媒体高级开发课程进行系统…

react的diff源码

react 的 render 阶段&#xff0c;其中 begin 时会调用 reconcileChildren 函数&#xff0c; reconcileChildren 中做的事情就是 react 知名的 diff 过程 diff 算法介绍 react 的每次更新&#xff0c;都会将新的 ReactElement 内容与旧的 fiber 树作对比&#xff0c;比较出它们…

消息队列-kafka-消息发送流程(源码跟踪) 与消息可靠性

官方网址 源码&#xff1a;https://kafka.apache.org/downloads 快速开始&#xff1a;https://kafka.apache.org/documentation/#gettingStarted springcloud整合 发送消息流程 主线程&#xff1a;主线程只负责组织消息&#xff0c;如果是同步发送会阻塞&#xff0c;如果是异…

【CSP试题回顾】202104-2-邻域均值

CSP-202104-2-邻域均值 关键点&#xff1a;二维差分数组 详见&#xff1a;【CSP考点回顾】差分数组 解题思路 初始化矩阵和参数&#xff1a;首先&#xff0c;代码接收矩阵的大小&#xff08;n x n&#xff09;&#xff0c;每个元素的亮度值&#xff08;位于[0, L]区间&…

基于Vue的体育汇App设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 核心技术的理论与分析 3 1.1 客户端技术 3 1.1.1 Vue.js框架 3 1.1.2 Vue.js路由管理 3 1.1.3 Vuex状态管理 3 1.1.4 MVVM开发模式 4 1.1.5 Vant组件库 5 1.2 服务端技术 5 1.2.1 Node.js 5 1.2.2 Egg.js框架 5 1.3 数据库技术 6 1.4 本章…

webUI自动化测试框架

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

【LeetCode】升级打怪之路 Day 16:二叉树题型 —— 二叉树的构造

今日题目&#xff1a; 654. 最大二叉树105. 从前序与中序遍历序列构造二叉树106. 从中序与后序遍历序列构造二叉树889. 根据前序和后序遍历构造二叉树 目录 LC 654. 最大二叉树 【easy】 Problem&#xff1a;根据遍历序列来还原二叉树 【classic】 ⭐⭐⭐⭐⭐LC 105. 从前序与中…