【机器学习经典算法】K近邻(KNN):核心与总结

2023-11-16

1. 初识K近邻

K-近邻(K-Nearest Neighbors, KNN)可以说是整个机器学习算法中最为简单的几个算法之一了,但即使是在目前大火的深度学习算法里也可以看它的影子,简单好用,学起来就完事了。简单点来说,给定一个训练集,找到其映射到特征空间中的对应向量,保存下来。当新来了一个测试实例,找到其在特征空间中最近的K个实例,看在这K个实例中属于哪一个类别的最多,就给测试样本赋予对应的标签

当K=1时,为最近邻算法


如上图所示,训练集有两类(蓝色、红色),新来了一个样本(绿色),要判断其属于哪一类。KNN算法就是在整个特征空间找到最近的K个参考对象(K=3),这K个对象里属于哪一个类别的数目多,就是赋予新样本对应的标签。比如这个例子中新样本就为红色类别。

2. 相知

2.1 K近邻三要素

三个基本要素:K值选择、距离度量、分类决策规则

模型:模型很简单,上一节就已经介绍过了,更公式化的定义可以参考李航老师的《统计学习方法》。这里提一下模型的本质,抛去测试过程,当确定三要素后,KNN根据训练集样本将特征空间划分成不同子空间,每个子空间的类别被确定,如下图所示。(如果不理解这句话,可以考虑最近邻的情况)
在这里插入图片描述
距离度量:常用的距离度量就是欧式距离,但其实任何距离度量都可以。这里展示一下 L p L_p Lp距离,不同的p有着不同的含义,这里就不展开讲了,贴一张图。

在这里插入图片描述

如下图所示,展示了 L p L_p Lp距离在p取不同时,在 R 2 R^2 R2空间上的一条等高线(线上的点与原点的距离相等),感兴趣的同学可以扩展到损失函数中的L1、L2正则化。

需要注意的是,不同度量下得到的最近邻可能不一样

k值的选择:当K值较小时,那么在测试时选择的领域范围就大,学习的近似误差减小(只有与输入较近的实例才会对预测结果起作用),估计误差增加(对近邻的实例点非常敏感,收益受噪声影响);当K值过大时,选择的领域范围就大,会减小模型的估计误差,但会增加学习的近似误差。

也可以说k值越小,模型越复杂,越容易过拟合;K值越大,模型变简单,极端情况K=N时,所有输出都一样。

近似误差与估计误差:https://blog.csdn.net/qq_35664774/article/details/79448076

k值一般取一个比较小的数值,通常采用交叉验证法来选取最优的k值。

分类决策规则:多数表决(等价于经验风险最小化,证明见《统计学习方法》)

2.2 KD树

k 近邻法最简单的实现方法是线性扫描(linear scan),即计算输入实例与每一个训练实例的距离。但当训练集很大时,这种方法非常耗时。而KD树(k-dimensional tree)可以提高搜索效率,减少计算量。kd树是一种对k维空间中的实例点进行储存以便对其进行快速检索的树形数据结构,其本质是二叉树,可以将最近邻的搜索时间由 O ( N ) O(N) O(N)降低到 O ( N l o g N ) O(NlogN) O(NlogN)

2.2.1 kd树的构建

kd树构建的核心思想就是递归地对数据进行垂直划分,具体流程如下:

在这里插入图片描述
其中(1)表示递归的初始条件,(2)表示递归逻辑,(3)为终止条件。上面的算法流程可能比较难以理解,其实通俗点理解就是:对于N个k维的训练数据,knn需要将其划分为N个区域,首先选取第一个维度,将所有数据按整个维度进行排序,选取中位数所对应的节点作为根节点。在该维度上小于该节点的值划分到左子树,大于该节点的值划分到右子树。这样就已经先划分成两个区域了,然后选取第二个维度,分别对这2个区域进行类似的划分(找到中位数节点进行划分),就这样依次递归下去,知道所有子区域都没有实例存在。【整个过程类似于平衡二叉搜索树的构建】

强烈推荐该视频:https://www.bilibili.com/video/BV1No4y1o7ac?p=21,看完你就懂了,也包含了实例的讲解。

在这里插入图片描述
在这里插入图片描述

2.2.2 kd树的搜索

kd树主要是为了加速KNN的检索过程,也就是说给定一个测试样本,去找到它对应的K个最近邻样本。以最近邻为例(很容易扩展到k近邻),其仍是一个递归的过程。具体流程如下:

在这里插入图片描述
对于构造的kd树,首先按照每个维度对应的划分找到一个叶子节点,将该叶子节点作为ans。递归地进行回退:首先检查该节点的兄弟节点是否比这个叶子节点更近,如果更近则进行转移,否则回退到父节点,然后计算距离是否更近,如果更近就更新ans。最后回退到根节点,就搜索结束,返回的ans即为最近邻节点。

对应的视频与示例:https://www.bilibili.com/video/BV1No4y1o7ac?p=22

3. 总结

KNN是最简单的分类与回归算法,虽然上面只介绍了分类的步骤,但是回归方法也是类似,进行KNN然后求均值作为结果返回。KNN三大要素:距离度量、k值选择、分类决策规则,其中K值越小模型越复杂,近似误差低,K值越大模型越简单,估计误差低。

K近邻算法虽然简单,但其局限性也非常明显。算法并没有根据数据显著地构建一个模型,而是存储了所有训练集特征,当训练数据很大时,时间和空间复杂度将会非常高。因此为了进一步提高计算效率,采用kd树进行优化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【机器学习经典算法】K近邻(KNN):核心与总结 的相关文章

随机推荐

  • parted创建硬盘分区并创建LVM

    目的 将两个三T的硬盘做成LVM sdc sdd 一 parted将硬盘进行分区 1 parted的命令方式 Parted 命令分为两种模式 命令行模式和交互模式 1 命令行模式 parted option device command 该
  • 【原创】第一个iOS应用程序

    摘要 第一个iOS应用程序 包括获取控件 绑定事件 设置属性等内容 iOS Objective C 目录 第一章 窗口与应用程序 第二章 添加视图 2 1 从nib文件初始化视图 2 2 使用脚本添加视图 第三章 添加子视图 3 1 通过x
  • 制作自己的 Kindle 电子书

    想象以下场景 你刚收到一台新的 Kindle Paperwhite 心中已然响起了轰轰烈烈的 我今年 或这个冬天 一定要阅读 100 本书 结果发现 想看的书 Amazon 上找不到 或者排版很糟糕 如何解决 自己动手做呗 准备工作 我使用
  • UE4 UI实现改键功能

    主要内容 本文主要讲解如何在UI中实现自定义按键的功能类似于游戏中的改键操作 用到的是UE4自带的第三人称案例 因为第三人称自带了小白人和几个按键绑定就不用再手动去设置 实现步骤 1 创建两个UMG用来展示UI效果 1 创建WBP Key
  • C++链表合并

    有l1和l2两个链表 这两个链表降序排列 把l2合并到l1中 并按降序排列 同时清空l2链表 例如l1 9 8 7 6 l2 12 11 10 5 4 3 2 1 合并后l1 12 11 10 9 8 7 6 5 4 3 2 1 l2 in
  • 【Android】利用intent启动浏览器

    文章目录 一 默认浏览器 二 指定浏览器 三 选择浏览器 一 默认浏览器 需要设置Action和Date属性 构造 Uri uri Uri parse https www baidu com Intent intent new Intent
  • SCADE Suite 状态机之变量隐式赋值

    SCADE Suite 状态机之变量隐式赋值 1 变量的隐式赋值 目的 简化模型设计 Last 只要没有显示赋值 便取上一周期的数值 Default 只要没有显示赋值 便取默认设置的数值 优先级更高 设置方法 2 定义变量的Last值 1
  • LeetCode 817:链表组件(计数)

    解法一 常规解法 建图 DFS 时间复杂度O n O n 空间复杂度因为需要存储图 所以是O n 这种方法是通解 对于所有图都适用 Definition for singly linked list struct ListNode int
  • lua元表以及元方法

    知微出凡 lua元表以及元方法 lua中的变量是没有数据类型的 值有类型 类型有八种nil number boolean string function thread userdata以及table Lua 中的每个值都可以有一个 元表 这
  • 62.[GIS基础]笛卡尔坐标系

    文章目录 笛卡尔坐标系 多坐标系 坐标系的嵌套 坐标变换 坐标系转换 转载请注明原始链接 http blog csdn net a464057216 article details 54578069 后续此博客不再更新 欢迎大家搜索关注微信
  • 基于粒子群算法(PSO)优化径向基神经网络(PSO-RBF)的分类预测。matlab代码,优化参数为扩散速度,采用交叉验证。多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就

    清空环境变量 warning off 关闭报警信息 close all 关闭开启的图窗 clear 清空变量 clc 清空命令行 读取数据 res xlsread 数据集 xlsx 分析数据 num class length unique
  • 抛去容抗角度,从电容充放电角度理解RC低通滤波器

  • 和你一起从零开始写RISC-V处理器(2)

    RISC V加法指令的实现 文章目录 RISC V加法指令的实现 上期回顾 一 正片开始 编写各个模块 pc reg模块 if模块 rom模块 if id模块 id模块 regs模块 id ex模块 ex模块 二 顶层模块搭建 三 测试文件
  • 学懂最小生成树(克鲁斯卡尔算法)

    本节 小编将带大家了解最小生成树的第二种构成算法 克鲁斯卡尔算法 Kruskal algorithm 当然 对另一种算法感兴趣的朋友可以看看之前的这篇文章 学懂最小生成树 普里姆算法 目录 一 实现原理 二 代码实现 一 实现原理 克鲁斯卡
  • 后端开发——Flask框架从入门到入坟(中)

    前言 在上一篇文章中荔枝已经梳理了Flask的基础语法 但是想要靠这些东西来写一个项目是远远不够的噢 我们还需要一个更加清晰的项目逻辑来搭建一个Flask后端项目框架 在真实的项目开发中 我们还需要了解如何搭建数据库 如何管理高效管理代码
  • leetcode刷题——栈与队列

    队列 vs 栈 栈 从头进 从头出 只有头部一个进出口 队列 从尾进 从头处 头和尾分别负责出和进 适用于配对问题 20 有效的括号 运用栈尾进头出的思想实现配对 当我们遇到一个左括号时 我们会期望在后续的遍历中 有一个相同类型的右括号将其
  • js 判断数组是否有元素重复

    这里有一个js数组 判断数组是否有重复元素 具体代码 var vecotr for i 0 i
  • rdkafka线程过多_Kafka快速入门(十一)——RdKafka源码分析

    Kafka快速入门 十一 RdKafka源码分析 一 RdKafka C源码分析 1 Kafka OP队列 RdKafka将与Kafka Broke的交互 内部实现的操作都封装成Operator结构 然后放入OP处理队列里统一处理 Kafk
  • 计算机应用技术图像图形处理,计算机图像处理应用技术论文

    摘要 全息技术是物理学中的重大发现 近年来在各个行业得到广泛的应用 作为全息技术中的两个重要部分 CCD和计算机图像处理技术 在推动数字全息新一轮发展中起到至关重要的作用 本文将着重从计算机应用方面阐述图像处理技术在全息中的应用 关键词 计
  • 【机器学习经典算法】K近邻(KNN):核心与总结

    文章目录 1 初识K近邻 2 相知 2 1 K近邻三要素 2 2 KD树 2 2 1 kd树的构建 2 2 2 kd树的搜索 3 总结 1 初识K近邻 K 近邻 K Nearest Neighbors KNN 可以说是整个机器学习算法中最为