【机器学习】KNN 算法介绍

news2025/1/18 11:40:54

文章目录

  • 一、KNN 简介
  • 二、KNN 核心思想
    • 实例
    • 分析:K 值的影响
  • 三、KNN 的关键
    • 1. 距离计算
      • 1. 闵可夫斯基距离
      • 2. 曼哈顿距离
      • 3. 欧氏距离
      • 4. 切比雪夫距离
      • 5. 余弦距离
      • 总结
    • 2. K值选择
  • 四、KNN 的改进:KDTree
  • 五、KNN 回归算法
  • 参考链接


一、KNN 简介

KNN 算法,或者称 k-最近邻算法,是 有监督学习 中的 分类算法 。它可以用于分类或回归问题,但它通常用作分类算法。


二、KNN 核心思想

KNN 的全称是 K Nearest Neighbors,意思是 K 个最近的邻居。该算法用 K 个最近邻来干什么呢?其实,KNN 的原理就是:当预测一个新样本的类别时,根据它距离最近的 K 个样本点是什么类别来判断该新样本属于哪个类别(多数投票)。

实例

图中绿色的点是待预测点,假设 K=3。那么 KNN 算法就会找到与它距离最近的三个点(这里用圆圈把它圈起来了),然后看这三个点中哪种类别多一些,比如这个例子中是蓝色三角形多一些,新来的绿色点就被归类到蓝三角了。
在这里插入图片描述
但是,当 K=5 的时候,判定就变得不一样了。这次变成红圆多一些,所以新来的绿点被归类成红圆。从这个例子中,我们就能看得出 k 值的确定对KNN算法的预测结果有着至关重要的影响。
在这里插入图片描述

分析:K 值的影响

如果k值比较小,相当于我们用较小的领域内的训练样本对实例进行预测。这时,算法的近似误差(Approximate Error)会比较小,因为只有与输入实例相近的训练样本才会对预测结果起作用。但是,它也有明显的缺点:算法的估计误差比较大,预测结果会对近邻点十分敏感,也就是说,如果近邻点是噪声点的话,预测就会出错。因此,k值过小容易导致KNN算法的过拟合

同理,如果k值选择较大的话,距离较远的训练样本也能够对实例预测结果产生影响。这时候,模型相对比较鲁棒,不会因为个别噪声点对最终预测结果产生影响。但是缺点也十分明显:算法的近邻误差会偏大,距离较远的点(与预测实例不相似)也会同样对预测结果产生影响,使得预测结果产生较大偏差,此时模型容易发生 欠拟合

因此,在实际工程实践中,我们一般采用交叉验证的方式选取 k 值(以下第三节会介绍)。通过以上分析可知,一般 k 值选得比较小,我们会在较小范围内选取 k 值,同时把测试集上准确率最高的那个确定为最终的算法超参数 k 。


三、KNN 的关键

实际上,KNN 算法有两个关键点:1. 点之间距离的计算2. K 值的选取

1. 距离计算

样本空间内的两个点之间的距离量度表示两个样本点之间的相似程度:距离越短,表示相似程度越高;反之,相似程度越低。

常用的距离量度方式包括:

  1. 闵可夫斯基距离
  2. 曼哈顿距离
  3. 欧氏距离
  4. 切比雪夫距离
  5. 余弦距离

1. 闵可夫斯基距离

闵可夫斯基距离本身不是一种距离,而是一类距离的定义。对于n维空间中的两个点x(x1,x2,…,xn)和y(y1,y2,…,yn),x和y之间的闵可夫斯基距离可以表示为:

在这里插入图片描述

其中,p是一个可变参数:

  • 当p=1时,被称为曼哈顿距离;
  • 当p=2时,被称为欧氏距离;
  • 当p=∞时,被称为切比雪夫距离。

2. 曼哈顿距离

根据闵可夫斯基距离定义,曼哈顿距离的计算公式可以写为:

在这里插入图片描述
它测量两点之间的绝对值。

3. 欧氏距离

根据以上定义,欧氏距离可以写为:

在这里插入图片描述

欧氏距离(L2范数)是最易于理解的一种距离计算方法,源自欧氏空间中两点间的距离公式,也是最常用的距离量度。它测量两点之间的直线距离。

通常 KNN 算法中使用的是欧式距离。

4. 切比雪夫距离

切比雪夫距离是将2个点之间的距离定义为其各坐标数值差的最大值。对应L∞范数:

在这里插入图片描述

5. 余弦距离

余弦相似度的取值范围是[-1,1],相同两个向量的之间的相似度为1。

余弦相似度的定义公式为 :

余弦距离的取值范围是[0,2]:

总结

这样我们就明白了如何计算距离。KNN 算法最简单粗暴的就是将预测点与所有点距离进行计算,然后保存并排序,选出前面 K 个值看看哪些类别比较多。但其实也可以通过一些数据结构来辅助,比如最大堆、KDTree,能够减小计算量,从而快速找到 K 个最近邻。

2. K值选择

通过上面那张图我们知道 K 的取值比较重要,那么该如何确定 K 取多少值好呢?答案是通过交叉验证(将样本数据按照一定比例,拆分出训练用的数据和验证用的数据,比如6:4拆分出部分训练数据和验证数据),从选取一个较小的 K 值开始,不断增加 K 的值,然后计算验证集合的方差,最终找到一个比较合适的 K 值。

通过交叉验证计算方差后你大致会得到下面这样的图:

在这里插入图片描述
这个图其实很好理解,当你增大 K 的时候,一般错误率会先降低,因为有周围更多的样本可以借鉴了,分类效果会变好。但是,K值太大的时候就会失去意义:这也很好理解,比如说你一共就35个样本,当你 K 增大到30的时候,KNN 基本上就没意义了。

所以选择 K 点的时候可以选择一个较大的临界 K 点,当它继续增大或减小的时候,错误率都会上升,比如图中的 K=10。


四、KNN 的改进:KDTree

KNN 算法最简单粗暴的就是将预测点与所有点距离进行计算,然后保存并排序,选出前面 K 个值看看哪些类别比较多。这样的直接暴力寻找的方法,在特征空间维度不高且训练样本容量小时,是可行的,但是当特征空间维度特别高或者样本容量较大时,计算过程就会非常耗时,这种方法就不可行了。

因此,为了快速查找到 k 个近邻,我们可以考虑使用特殊的数据结构存储训练数据,用来减少搜索次数。其中,KDTree就是最著名的一种。

在这里插入图片描述

KDTree(K-dimension Tree)是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构。KDTree是一种二叉树,表示对k维空间的一种划分构造KDTree相当于不断地利用垂直于坐标轴的超平面将k维空间进行切分,构成一系列的k维超矩形区域。KDTree的每个节点对应于一个k维超矩形区域。利用KDTree可以省去对大部分数据点的搜索,从而减少搜索的计算量。

关于 KDTree 的详细介绍,请参考我的另一篇文章:【KNN分类】kd-tree


五、KNN 回归算法

上文所述的 KNN 算法主要用于分类,实际上,KNN算法也可以用于回归预测。接下来,我们讨论一下KNN算法如何用于回归。

与分类预测类似,KNN算法用于回归预测时,同样是寻找新来的预测实例的 k 近邻,然后对这 k 个样本的目标值取 均值 即可作为新样本的预测值:
在这里插入图片描述


参考链接

  1. Python—KNN分类算法(详解)
  2. 什么是KNN算法?

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

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

相关文章

想在微信上使用chatGPT?小程序?公众号?企业微信,最终还是选择了企业微信版本的chatgpt

chatgpt的接口现在都可以正常用了,但是怎么把这个功能放在手机上随用随开呢?微信个人聊天版本小程序版本公众号版本企业微信版本逻辑实现方式微信个人聊天版本 网上很多微信机器人版本的,但是原理是网页版微信,很多账号都不能登陆…

golang指针

指针 区别于C/C中的指针,Go语言中的指针不能进行偏移和运算,是安全指针。 要搞明白Go语言中的指针需要先知道3个概念:指针地址、指针类型和指针取值。 1.1. Go语言中的指针 Go语言中的函数传参都是值拷贝,当我们想要修改某个变…

Linux中如何理解线程?线程ID到底是什么?

朋友们好,这里简要介绍了进程和线程的区别以及对LINUX中线程ID的理解,本人目前理解尚浅,若文中有表述不当的地方还望理解并指正,谢谢大家! 文章目录一:进程和线程二:线程ID和进程地址空间布局一…

5 项目部署

5.1 Linux-项目部署 5.1.1 环境 5.1.1.1 开发环境(dev) 外部用户无法访问,开发人员使用,版本变动很大 平时大家大多是在Windows或者Mac操作系统下去编写代码进行开发. 在开发环境中安装大量的软件,这样会导致环境的稳…

2022 年度盘点 | 更成熟的 AI,更破圈的技术狂欢

By 超神经内容一览:2022 年 AI 领域发展不断提速,新技术成果纷纷落地,模型迭代加速升级。本文总结了 2022 年 AI 领域各大公司的技术成就。关键词:年终盘点 大厂 技术创新2022 年在此起彼伏的咳嗽声中接近尾声,这一…

onCreate、onSaveInstanceState、onRestoreInstance一个参数和两个参数

Android Studio移动应用开发——onCreate、onSaveInstanceState、onRestoreInstance一个参数和两个参数_dear_jing的博客-程序员宅基地 - 程序员宅基地 在做Android生命周期实验过程中,把 Log.i(TAG, "(1) onCreate()") 写到了含有两个参数的函数 onSave…

HTML5 元素拖放

文章目录HTML5 元素拖放概述触发事件实现元素拖放功能dataTransfer元素拖动效果垃圾箱效果HTML5 元素拖放 概述 在HTML5中,我们只需要给元素添加一个draggable属性,然后设置该属性值为true,就能实现元素的拖放。 拖放,指的是“…

【Python】Numpy分布函数总结

文章目录总表均匀分布和三角分布幂分布与正态分布相关的分布与Gamma相关的分布极值分布总表 np.random中提供了一系列的分布函数,用以生成符合某种分布的随机数。下表中,如未作特殊说明,均有一个size参数,用以描述生成数组的尺寸…

【综合笔试题】难度 1.5/5,常规二叉树爆搜题

题目描述 这是 LeetCode 上的 95. 不同的二叉搜索树 II ,难度为 中等。 Tag : 「树」、「二叉搜索树」、「BST」、「DFS」、「递归」、「爆搜」 给你一个整数 n,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以…

2022出圈的ML研究:爆火的Stable Diffusion、通才智能体Gato,LeCun转推

这些机器学习领域的研究你都读过吗? 2022 年即将步入尾声。在这一年里,机器学习领域涌现出了大量有价值的论文,对机器学习社区产生了深远的影响。 今日,ML & NLP 研究者、Meta AI 技术产品营销经理、DAIR.AI 创始人 Elvis S.…

CSRF漏洞渗透与攻防(一)

目录 前言 什么是CSRF漏洞 CSRF实现流程 CSRF漏洞危害 XSS漏洞危害 CSRF与XSS区别 CSRF分类 GET型: POST型: CSRF漏洞案列模拟 CSRF常用Payload: CSRF漏洞挖掘 检测工具 CSRF漏洞防御 防御思路 我们该如何去防御CSRF漏洞…

LeetCode动态规划—打家劫舍从平板板到转圈圈(198、213)

打家劫舍平板板打家劫舍转圈圈打家劫舍(进阶版)平板板打家劫舍 转化子问题: 按顺序偷n间房子,就是考虑偷前n-1间房子还是偷前n-2间房子再偷第n间房子。 列出公式: res[n] max{ res[n-1] , 数组中最后一个数据res[n-…

企业信息化之源代码防泄密场景分析

场景描述 随着企业信息化发展迅速,越来越多的无形资产面临着被泄露,被盗取的,或员工无意导致的数据泄密风险。尤其是有源码开发的企业,源代码的安全更是重中之重,一旦泄密,有可能给企业带来不可估量的损失…

全程数字化的企业电子招标采购管理系统源码

全程数字化的采购管理 智能化平台化电子化内外协同 明理满足采购业务全程数字化, 实现供应商管理、采购需求、全网寻源、全网比价、电子招 投标、合同订单执行的全过程管理。 传统采购模式面临的挑战 如何以最合适的价格,找到最优的供应商,购买到最好的产品和服务?…

程序员必备网站,建议收藏!

俗话说的好,一个程序员,20%靠知识储备,80%靠网络搜索。 打开代码,打开Google,开始工作。 那么常用的写码软件,你知道几个呢? 下面我们来一起看一下常用的写码软件吧~ 建议收藏本文&#xff…

【算法】面试题 - 链表

链表相关面试题141. 环形链表问题:快慢指针为什么一定会相遇142. 环形链表 II问题:如何确认入口160. 相交链表237. 删除链表中的节点19. 删除链表的倒数第 N 个结点21. 合并两个有序链表23. 合并K个升序链表(两种解法)扩展&#x…

国产手机扬眉吐气,终于打击了苹果的嚣张气焰

苹果在9月份、10月份都取得了快速增长,而国产手机品牌持续下滑,但是11月份终于让国产手机捡回了主动权,11月份的数据显示有国产手机品牌的出货量大幅增长,而苹果的出货量却大幅下滑,国产手机成功反击了苹果。分析机构给…

Vue + SpreadJS 实现高性能数据展示与分析

Vue SpreadJS 实现高性能数据展示与分析 在前端开发领域,表格一直都是一个高频使用的组件,尤其是在中后台和数据分析场景下。但当一屏展示数据超过1000条数据记录时,会出现浏览器卡顿等问题,严重影响客户体验。为解决这些性能问…

Seay代码审计系统审计实战

今天继续给大家介绍渗透测试相关知识,本文主要内容是Seay代码审计系统审计实战。 免责声明: 本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负! 再次强调:严禁对未…

【算法题解】5. 删除有序数组中的重复项 + 移动零

文章目录删除有序数组中的重复项题目解题思路代码实现复杂度分析移动零题目解题思路代码实现复杂度分析删除有序数组中的重复项 题目 给你一个 升序排列 的数组 nums ,请你原地删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新…