【机器学习与实现】K近邻算法

目录

    • 一、KNN算法简介
      • (一)KNN算法包括三个步骤
      • (二)超参数K的影响
    • 二、距离度量
    • 三、邻近点的搜索算法
    • 四、KNN算法的特点
    • 五、KNN常用的参数及其说明
    • 六、分类算法的性能度量
      • (一)混淆矩阵及相关概念
      • (二)F1_score和其他度量指标


一、KNN算法简介

想一想:下面图片中只有三种豆,有三个豆是未知的种类,如何判定他们的种类?

在这里插入图片描述
1968年,Cover和Hart提出了最初的近邻算法。

(一)KNN算法包括三个步骤

  1. 算距离:给定测试样本,计算它与训练集中的每个样本的距离;
  2. 找邻居:圈定距离最近的k个训练样本,作为测试样本的近邻;
  3. 做分类:根据这k个近邻归属的主要类别,来对测试样本分类。

k值的选择距离度量分类决策规则是KNN的3个基本要素。

(二)超参数K的影响

在这里插入图片描述
K值取3时,判断绿色点的类别为蓝色; K值取5时,判断绿色点的类别为红色为了能得到较优的K值,可以采用交叉验证和网格搜索的办法分别尝试不同K值下的分类准确性。

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

在这里插入图片描述
左图为k选取不同值时对鸢尾花分类影响。当k逐步增大时,局部噪音样本对边界的影响逐渐减小,边界形状趋于平滑。较大的k是会抑制噪声的影响,但是使得分类界限不明显。举个极端例子,如果选取k值为训练样本数量,即k=n,采用等权重投票,这种情况不管查询点q在任何位置,预测结果仅有一个(分类结果只能是样本数最多的那一类,kNN这一本来与空间位置相关的算法因此失去了作用)。这种训练得到的模型过于简化,忽略样本数据中有价值的信息。

二、距离度量

1、欧氏距离(Euclidean Distance)

n n n 维空间点 a ( x 11 , x 12 , . . . , x 1 n ) a(x_{11},x_{12},...,x_{1n}) a(x11,x12,...,x1n) b ( x 21 , x 22 , . . . , x 2 n ) b(x_{21},x_{22},...,x_{2n}) b(x21,x22,...,x2n) 间的欧氏距离(两个 n n n维向量): d 12 = ∑ k = 1 n ( x 1 k − x 2 k ) 2 d_{12}=\sqrt{\sum_{k=1}^n(x_{1k}-x_{2k})^2} d12=k=1n(x1kx2k)2

2、曼哈顿距离(Manhattan Distance)

曼哈顿距离(Manhattan Distance)是指两点在南北方向上的距离加上在东西方向上的距离。

n n n 维空间点 a ( x 11 , x 12 , . . . , x 1 n ) a(x_{11},x_{12},...,x_{1n}) a(x11,x12,...,x1n) b ( x 21 , x 22 , . . . , x 2 n ) b(x_{21},x_{22},... ,x_{2n}) b(x21,x22,...,x2n) 的曼哈顿距离为 d 12 = ∑ k = 1 n ∣ x 1 k − x 2 k ∣ d_{12}=\sum_{k=1}^n|x_{1k}-x_{2k}| d12=k=1nx1kx2k

在这里插入图片描述
图中两点间的绿线代表的是欧式距离 。红线,蓝线和黄线代表的都是曼哈顿距离,由此可见在两点间曼哈顿距离相等的情况下,线路有多种情况。

3、余弦距离(Cosine Distance)

两个 n n n 维样本点 a ( x 11 , x 12 , . . . , x 1 n ) a(x_{11},x_{12},...,x_{1n}) a(x11,x12,...,x1n) b ( x 21 , x 22 , . . . , x 2 n ) b(x_{21},x_{22},...,x_{2n}) b(x21,x22,...,x2n) 的夹角余弦为: c o s ( θ ) = a ⋅ b ∣ a ∣ ∣ b ∣ cos(\theta)=\frac{a\cdot b}{|a||b|} cos(θ)=a∣∣bab c o s ( θ ) = ∑ n k = 1 x 1 k x 2 k ∑ n k = 1 x 1 k 2 ∑ n k = 1 x 2 k 2 cos(\theta)=\frac{\sum_n^{k=1}x_{1k}x_{2k}}{\sqrt{\sum_n^{k=1}x_{1k}^2\sum_n^{k=1}x_{2k}^2}} cos(θ)=nk=1x1k2nk=1x2k2 nk=1x1kx2k

4、切比雪夫距离(Chebyshev Disatance)

在这里插入图片描述
切比雪夫距离(Chebyshev Disatance)是指二个点之间的距离定义是其各坐标数值差绝对值的最大值。
D C h e b y s h e v ( p , q ) = max ⁡ i ( ∣ p i − q i ∣ ) D_{Chebyshev}(p,q)=\max_{i}(|p_i-q_i|) DChebyshev(p,q)=imax(piqi)

这也等于以下 L p L_p Lp 度量的极限: lim ⁡ k → ∞ ( ∑ i = 1 n ∣ p i − q i ∣ k ) 1 k \lim_{k\to \infty}\left(\sum_{i=1}^n|p_i-q_i|^k\right)^{\frac{1}{k}} klim(i=1npiqik)k1 因此切比雪夫距离也称为 L ∞ L_{\infty} L 度量(无穷范数)。

国际象棋棋盘上二个位置间的切比雪夫距离是指王要从一个位子移至另一个位子需要走的步数。由于王可以往斜前或斜后方向移动一格,因此可以较有效率的到达目的的格子。上图是棋盘上所有位置距 f 6 f6 f6 位置的切比雪夫距离。

5、闵可夫斯基距离(Minkowski Distance)

闵氏距离的定义:两个 n n n 维变量 a ( x 11 , x 12 , . . . , x 1 n ) a(x_{11},x_{12},...,x_{1n}) a(x11,x12,...,x1n) b ( x 21 , x 22 , . . . , x 2 n ) b(x_{21},x_{22},...,x_{2n}) b(x21,x22,...,x2n) 间的闵可夫斯基距离定义为: d 12 = ∑ k = 1 n ∣ x 1 k − x 2 k ∣ p p d_{12}=\sqrt[p]{\sum_{k=1}^n\left|x_{1k}-x_{2k}\right|^p} d12=pk=1nx1kx2kp 其中 p p p 是一个变参数:

  • p = 1 p=1 p=1 时,就是曼哈顿距离;
  • p = 2 p=2 p=2 时,就是欧氏距离;
  • p → ∞ p→\infty p 时,就是切比雪夫距离。

KNN算法默认使用闵可夫斯基距离。

三、邻近点的搜索算法

  KNN算法需要在中搜索与x最临近的k个点,最直接的方法是逐个计算x与中所有点的距离,并排序选择最小的k个点,即线性扫描。
  当训练数据集很大时,计算非常耗时,以至于不可行。实际应用中常用的是kd-tree (k-dimension tree) 和ball-tree这两种方法。ball-tree是对kd-tree的改进,在数据维度大于20时,kd-tree性能急剧下降,而ball-tree在高维数据情况下具有更好的性能。
  kd-tree以空间换时间,利用训练样本集中的样本点,沿各维度依次对k维空间进行划分,建立二叉树,利用分治思想大大提高算法搜索效率。

样本集不平衡时的影响:

观察下面的例子,对于位置样本X,通过KNN算法,显然可以得到X应属于红点,但对于位置样本Y,通过KNN算法我们似乎得到了Y应属于蓝点的结论,而这个结论直观来看并没有说服力。

在这里插入图片描述
由上面的例子可见:该算法在分类时有个重要的不足是,当样本不平衡时,即:一个类的样本容量很大,而其他类样本容量很小时,很有可能导致当输入一个未知样本时,该样本的K个邻居中大数量类的样本占多数。

解决方法:采用权值的方法来改进。和该样本距离小的邻居权值大,和该样本距离大的邻居权值则相对较小,避免因一个类别的样本过多而导致误判。

四、KNN算法的特点

优点:

  1. KNN 理论简单,容易实现;
  2. 既可以用来做分类也可以用来做回归,还可以用于非线性分类;
  3. 新数据可以直接加入数据集而不必进行重新训练;
  4. 对离群点不敏感。

缺点:

  1. 样本不平衡问题(即有些类别的样本数量很多,而其它样本的数量很少)效果差;
  2. 不适合高维数据,对于样本容量大的数据集计算量比较大(体现在距离计算上);
  3. KNN 每一次分类都会重新进行一次全局运算;
  4. K值不好确定;
  5. 各属性的权重相同,影响准确率。

五、KNN常用的参数及其说明

class sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, weights='uniform',algorithm='auto',
leaf_size=30, p=2, metric='minkowski', metric_params=None,n_jobs=1,**kwargs)
参数名称说明
n_neighbors接收int。表示近邻点的个数,即K值。默认为5。
weights接收str或callable,可选参数有“uniform”和“distance”。表示近邻点的权重,“uniform”表示所有的邻近点权重相等;“distance”表示距离近的点比距离远的点的权重大。默认为“uniform”。
algorithm接收str,可选参数有“auto”“ball_tree”“kd_tree”和“brute”。表示搜索近邻点的算法。默认为“auto”,即自动选择。
leaf_size接收int。表示kd树和ball树算法的叶尺寸,它会影响树构建的速度和搜索速度,以及存储树所需的内存大小。默认为30。
p接收int。表示距离度量公式,1是曼哈顿距离公式;2是欧式距离。默认为2。
metric接收str或callable。表示树算法的距离矩阵。默认为“minkowski”。
metric_params接收dict。表示metric参数中接收的自定义函数的参数。默认为None。
n_jobs接收int。表示并行运算的(CPU)数量,默认为1,-1则是使用全部的CPU。

六、分类算法的性能度量

(一)混淆矩阵及相关概念

在这里插入图片描述
在这里插入图片描述
说明:
(1)结论中的正例、反例以预测值为准,而前面的定语真、假以真实值为准;
(2)预测值与真实值一致,则定语为真,预测值与真实值不一致则定语为假;
(3)主对角线表示预测值与真实值相符,副对角线表示预测值与真实值不符。

相关概念:

  • 准确率ACCuracy:全部预测中,预测正确的比例(即主对角线的占比)
  • 查准率Precision :预测的正例中,预测正确(真正例)的比例
  • 查全率或找回率Recall:真实正例中,预测正确(真正例)的比例

准确率 A C C = T P + T N T P + T N + F N + F P 准确率ACC=\frac{TP+TN}{TP+TN+FN+FP} 准确率ACC=TP+TN+FN+FPTP+TN 查准率 P = T P T P + F P 查准率P=\frac{TP}{TP+FP} 查准率P=TP+FPTP 查全率 R = T P T P + F N 查全率R=\frac{TP}{TP+FN} 查全率R=TP+FNTP

(二)F1_score和其他度量指标

y_true = [1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0]
y_pred = [1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0]

在这里插入图片描述
  查准率和查全率是一对矛盾的度量,一般来说,查准率高时,查全率往往会偏低,查全率高时,查准率往往会偏低。而F1-Score指标综合了Precision与Recall的产出的结果,是F1是基于查准率与查重率的调和平均。F1-Score的取值范围从0到1,1代表模型的输出最好0代表模型的输出结果最差

准确率 A C C = 2 + 3 2 + 4 + 3 + 3 = 5 12 准确率ACC=\frac{2+3}{2+4+3+3}=\frac{5}{12} 准确率ACC=2+4+3+32+3=125 查准率 P r e c i s i o n = 3 4 + 3 = 3 7 查准率Precision=\frac{3}{4+3}=\frac{3}{7} 查准率Precision=4+33=73 查全率 R e c a l l = 3 3 + 3 = 3 6 查全率Recall=\frac{3}{3+3}=\frac{3}{6} 查全率Recall=3+33=63 1 F 1 _ s c o r e = 1 2 ⋅ ( 1 P + 1 R ) ⇒ F 1 _ s c o r e = 2 ⋅ P ⋅ R P + R \frac{1}{F1\_score}=\frac{1}{2}\cdot(\frac{1}{P}+\frac{1}{R})\Rightarrow F1\_score=\frac{2\cdot P\cdot R}{P+R} F1_score1=21(P1+R1)F1_score=P+R2PR F 1 _ s c o r e = 2 × 3 7 × 3 6 3 7 + 3 6 = 6 13 F1\_score=\frac{2×\frac{3}{7}×\frac{3}{6}}{\frac{3}{7}+\frac{3}{6}}=\frac{6}{13} F1_score=73+632×73×63=136

此外,还有P-R曲线、ROC曲线、 AUC值等分类性能的指标。

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

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

相关文章

从零创建一个vue2项目

标题从零创建一个vue2项目,项目中使用TensorFlow.js识别手写文字 npm切换到淘宝镜像 npm config set registry https://registry.npm.taobao.org安装vue/cli -g npm install -g vue/cli检查是否安装成功 vue -V创建项目 vue create 项目名安装TensorFlow npm …

韶音、南卡、倍思开放式耳机值得买吗?王牌机型对比测评

今年,开放式耳机市场迎来了众多新品,为消费者提供了丰富的选择。在这样的背景下,正确挑选一款既符合音质需求又兼具佩戴舒适的开放式耳机显得格外关键。作为长期使用开放式耳机的用户,我发现很多人在韶音、南卡、漫步者这三个品牌…

k8s v1.20二进制部署

目录 一、环境准备 二、操作系统初始化配置 2.1.关闭防火墙 ​编辑 2.2.关闭selinux 2.3.关闭swap 2.4.根据规划设置主机名 2.5在master添加hosts 2.6.调整内核参数 2.7.时间同步 三、部署 docker引擎 3.1.所有 node 节点部署docker引擎 四、部署 etcd 集群 4.1.…

【数据库】docker搭建mysql8一主两从节点,配置proxysql读写分离

docker搭建mysql8一主两从节点,配置proxysql读写分离 一、docker 搭建 mysql8 一主两从节点1.1 相关配置文件与docker启动1.2 半同步复制1.3 主从同步异常处理 二、mysql 中间件 ProxySql 配置读写分离2.1 在mysql服务里创建给proxySQL访问的用户2.2 安装ProxySql及…

Reactor Netty TCP 服务器端-响应式编程-011

🤗 ApiHug {Postman|Swagger|Api...} = 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱,有温度,有质量,有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace The Next Generation API Development Platform…

2024第八季完美童模 上海翎秀赛区 初赛 火热启动

第八季完美童模新篇启航,打响2024全明星联赛第三站的火热赛程!本季全球赛亮点纷呈,带领全球选手体验暑期最高规格国民赛!6季上榜CCTV新闻报道,稳坐行业赛事头把交椅;分赛区遍布全球各地,覆盖350…

【Linux】自动化构建工具make/Makefile和git介绍

🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343🔥 系列专栏:https://blog.csdn.net/qinjh_/category_12625432.html 目录 前言 Linux项目自动化构建工具-make/Makefile 举例 .PHONY 常见符号 依赖关系…

前端报错 SyntaxError: Unexpected number in JSON at position xxxx at JSON.parse

问题描述​ 控制台提示 SyntaxError: Unexpected number in JSON at position xxxx at JSON.parse 问题原因​ 原因:JSON 数据格式错误,是否符合 JSON 格式。 解决方法​ 应为json格式数据 什么是json格式数据 JSON(JavaScript Object …

使用sqlmodel实现唯一性校验2,插入之前检查是否已存在

虽然之前添加唯一性校验的方法能够解决数据唯一的问题,但是如果忘了处理异常,则可能会导致程序崩溃。 在此基础上,我们可以在插入数据之前检查该数据是否已存在。 原来的代码: from sqlmodel import Field, Session, SQLModel,…

基于Python实现蔬菜水果识别

蔬菜水果识别在农业生产、食品加工和市场销售等领域具有重要意义。随着计算机视觉和机器学习技术的发展,利用图像识别技术实现蔬菜水果的自动化识别已成为可能。 目录 引言研究背景问题陈述研究目标文献综述蔬菜水果识别的相关研究概述基于计算机视觉和机器学习的图像识别方法…

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第20课-烟花插件

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第20课-烟花插件 使用dtns.network德塔世界(开源的智体世界引擎),策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎&am…

光纤VS紫外:如何选择最适合您生产线的激光打标机?

光纤激光打标机和紫外激光打标机在制造业中都有其独特的应用,但两者在原理、特点和应用范围上存在一些差异。 光纤激光打标机是一种采用光纤输出激光,并通过高速扫描振镜系统实现打标功能的新一代激光打标机系统。它电光转换效率高,达到30%以…

鸿蒙内核源码分析(gn应用篇) | gn语法及在鸿蒙的使用

gn是什么? gn 存在的意义是为了生成 ninja,如果熟悉前端开发,二者关系很像 Sass和CSS的关系. 为什么会有gn,说是有个叫even的谷歌负责构建系统的工程师在使用传统的makefile构建chrome时觉得太麻烦,不高效,所以设计了一套更简单,更高效新的构建工具gnninja,然后就被广泛的使用…

轻松掌握RAID级别

一、官方说明: RAID(英文全称 Redundant Array of Independent Disks)翻译成中文(独立磁盘冗余阵列)。 RAID 是一种将多块独立磁盘,组成一组逻辑磁盘的技术。RAID 级别分为 0、1、3、5、6等,可…

【Qt 学习笔记】Qt常用控件 | 容器类控件 | Tab Widget的使用及说明

博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt常用控件 | 容器类控件 | Tab Widget的使用及说明 文章编号&#xf…

健康行业CRM软件-保健行业CRM解决方案示例

Z公司面临客户信息管理和销售效率的挑战,提出使用ZohoCRM解决方案。ZohoCRM可集中管理客户信息、自动化销售流程并优化客户关系,提供数据分析和市场趋势洞察,帮助Z公司提升销售效率和客户满意度。 一、健康公司痛点 Z公司作为一家专注于特膳…

光数据传送器|光通讯传感器极速版OPT系列尺寸与安装步骤

光数据传送器|光通讯传感器极速版OPT系列是利用可见光及不可见光作为信息载体,无需光纤、网线等有线介质,在空中直接进行信息传输的无线方式通信。驱动光源以可见光及不可见光的高速明暗变化来传输数字信号,以极高光频率双向发射接收光信号&a…

CSRF漏洞原理攻击与防御

CSRF(Cross-site request forgery)跨站请求伪造:也被称为“One Click Attack”或者Session Riding, 通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但…

设计模式-工厂模式设计与详解

一、设计模式介绍 设计模式是我们开发中常常需要面对的核心概念,它们是解决特定问题的模板或者说是经验的总结。这些模式被设计出来是为了让软件设计更加清晰、代码更加可维护且能应对未来的变化。良好的设计模式不仅能解决重复代码的问题,还能使团队中…

408数据结构-哈夫曼树 自学知识点整理

前置知识:二叉树的概念、性质与存储结构 哈夫曼树 哈夫曼树的定义 首先需要明确几个概念。 路径:从树中的一个结点到另一个结点之间的分支构成这两个结点之间的路径。 路径长度:路径上的分支数目称为路径长度。 权(值):树中结点…