KNN算法 | K近邻:KD Tree、球树、KNN数据下采样策略

目录

  • 一. KNN算法实现方式
    • 1. 蛮力实现(brute)
    • 2. KD树(kd_tree)
    • 3. 球树(ball_tree)
  • 二. KD Tree算法
    • 1. 构建方式
    • 2. KD Tree 查找最近邻
  • 三. 球树(Ball Tree)
    • 1. 构建方式
  • 四. KNN评价
    • 1. 优点
    • 2. 缺点
  • 五. 延申
    • 1. KNN数据下采样策略
      • 策略1
      • 策略2
      • 策略3
      • 策略4 Condensed Nearest Neighbor()

KNN基础介绍篇中,我们通过KNN伪代码了解了该算法的逻辑;有没有发现,该算法在训练过程只是进行了数据加载,没有对数据进行任何其他的操作

对于样本数量较小的情况,或许该操作并无不妥;但是当面对海量的数据时,这种方式会有很明显的效率过低问题(即:输入待测样本后在所有数据中寻找K个最近的邻居,效率过低)

本篇,我们来解决这个问题

一. KNN算法实现方式

1. 蛮力实现(brute)

	具体操作:计算预测样本到所有训练集样本的距离选择最小的k个距离即可得到K个最邻近点缺点:当特征数比较多、样本数比较多的时候,算法的执行效率比较低

2. KD树(kd_tree)

	具体操作:对训练数据进行建模,构建KD树根据建好的模型来获取邻近样本数据

3. 球树(ball_tree)

	具体操作:

球树是根据KD树修改后的一种算法,还有一些从KD树修改后的求解最邻近点的算法,例如:BBF Tree、MVP Tree等

二. KD Tree算法

KD Tree是KNN算法中用于计算最近邻的快速、便捷构建方式

  • 当样本数据量较少时,我们可以使用brute的方法来求解最近邻,即计算到所有样本的距离
  • 当样本数据量较大时,可以使用KD Tree来快速的计算,提高效率

1. 构建方式

假设样本集数据为 m ∗ n m*n mn的特征矩阵,即m个样本,n维数据

	二叉搜索树左子树的数值小于右子树根节点一般为数据的中位数节点判断:分别计算n个特征的方差用方差最大的第k个特征的中位数作为根节点

例子:
训练集数据 ( 2 , 3 ) , ( 5 , 4 ) , ( 9 , 6 ) , ( 4 , 7 ) , ( 8 , 1 ) , ( 7 , 2 ) (2,3), (5,4), (9,6), (4,7), (8,1), (7,2) (2,3),(5,4),(9,6),(4,7),(8,1),(7,2)

对于 x ( 1 ) x^{(1)} x(1)轴的特征值,有:2,5,9,4,8,7;方差为5.81
对于 x ( 2 ) x^{(2)} x(2)轴的特征值,有:3,4,6,7,1,2;方差为4.47
因此,数据按照 x ( 1 ) x^{(1)} x(1)轴的特征进行划分,且以该轴中位数为根节点
在这里插入图片描述
KD树特征空间图:
在这里插入图片描述
对于左子树:

对于 x ( 1 ) x^{(1)} x(1)轴的特征值,有:2,5,4;方差为1.56
对于 x ( 2 ) x^{(2)} x(2)轴的特征值,有:3,4,7;方差为2.89
因此,数据按照 x ( 2 ) x^{(2)} x(2)轴的特征进行划分,且以该轴中位数为根节点

对于右子树:

对于 x ( 1 ) x^{(1)} x(1)轴的特征值,有:9,8;方差为0.25
对于 x ( 2 ) x^{(2)} x(2)轴的特征值,有:1,6;方差为6.25
因此,数据按照 x ( 2 ) x^{(2)} x(2)轴的特征进行划分,且以该轴中位数为根节点
在这里插入图片描述
KD树特征空间图:
在这里插入图片描述

下面,我们对叶子节点进行划分(可以按照 x ( 1 ) x^{(1)} x(1)轴划分),此时划分到每个叶子节点只有一个样本
在这里插入图片描述
KD树特征空间图:
在这里插入图片描述

	不加限制时,上述构造过程会划分到每个叶子节点只有一个样本;但是没有必要这样做,可以限制样本数少于某个值时停止划分每个节点都要保存是按哪个轴划分的

2. KD Tree 查找最近邻

在这里插入图片描述
目标:求(25,135)的3个近邻,即K=3

  • 操作1:初始化最近距离表

     	输入K值初始化最近距离表输出最近距离表其中:初始化的欧氏距离为inf,即+∞
    

在这里插入图片描述

  • 操作2:回溯路径&计算距离
    在这里插入图片描述

     	输入构建好的KD-Tree和待预测的样本点输出回溯路径表注意:目标点可能在划分节点的左子树,也可能在划分节点的右子树与目标点距离最近的点,不一定在目标点所在叶子节点上,有可能在其它节点上
    

    在这里插入图片描述

    节点 ( 65 , 12 ) (65,12) (65,12)的计算:

    25-65 = 40

    135-12 = 123

    4 0 2 + 12 3 2 = 129.34 \sqrt{40^{2}+123^{2}}=129.34 402+1232 =129.34

  • 操作3:更新距离表
    在这里插入图片描述

  • 操作4:计算划分维度距离

在这里插入图片描述

		以129.34为搜索半径,划分维度距离当搜索距离大于划分维度距离时,划分点另一侧的点也要纳入计算 如果 划分维度上目标点>划分点,则目标点在右子树,此时左子树也要纳入计算如果 划分维度上目标点<划分点,则目标点在左子树,此时右子树也要纳入计算。

在这里插入图片描述

在这里插入图片描述

  • 操作5:更新新回溯路径表&计算距离
    在这里插入图片描述

  • 操作6:更新距离表
    在这里插入图片描述

  • 操作7:计算划分维度距离

    	以67.67为搜索半径,划分维度距离
    

在这里插入图片描述

至此,没有产生新的回溯路径表,计算完成

最终,(25,135)的3个近邻为 ( 2 , 132 ) 、 ( 5 , 87 ) 、 ( 3 , 199 ) (2,132)、(5,87)、(3,199) (2,132)(5,87)(3,199)

三. 球树(Ball Tree)

对于KD树特征空间矩形图而言,在进行划分维度距离操作时,超球面时常会因菱角相交导致一些无关多余的搜索

针对KD树的上述缺陷,球树应运而生,通过将特征点转化为球状分割,从而减少无效相交

1. 构建方式

先构建一个超球体,这个超球体是可以包含所有样本的最小球体

	具体操作:从球中选择一个离球中心最远的点选择第二个点离第一个点最远将球中所有的点分配到这两个聚类中心附近计算每个聚类的中心,以及聚类能够包含它所有数据点所需的最小半径此时我们得到了两个子超球体(和KD树里面的左右子树对应)对于这两个子超球体,递归执行步骤最终得到了一个球树

四. KNN评价

1. 优点

  1. 可以用来做分类(天然的多分类算法),也可以用来做回归;
  2. 可用于非线性分类
  3. 训练时间复杂度比支持向量机之类的算法低,仅为O(n)
  4. 和朴素贝叶斯之类的算法比,对数据没有假设,准确度高,对异常点不敏感
  5. 该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分

2. 缺点

  1. 计算量大,尤其是特征数非常多的时候
  2. 样本不平衡的时候,对稀有类别的预测准确率低
  3. KD树,球树之类的模型建立需要大量的内存
  4. 使用懒散学习方法,基本上不学习,导致预测时速度比起逻辑回归之类的算法慢
  5. 相比决策树模型,KNN模型可解释性不强

五. 延申

机器学习篇的分享即将接近尾声,这里我们对算法进一步阐述:

首先,某个算法可在整个数据集上进行训练,从而得到一个符合目标的模型;
当然,某个算法也可以作为大算法的一部分独立使用,以实现目标
    比如:用线性回归在某几条数据上寻找一条目标直线

那么,对于KNN来说,该算法可以:

  • 填缺失值

  • 平衡数据

     	搜集更多的数据,使数据达到平衡改变样本的数量(包括增加-上采样和减少-下采样)数据增强(从现有的训练样本中生成新的高质量的训练样本)改变样本重要度(就是给予不同的权重)改变评价指标,使之更符合不平衡数据的评定改变代价敏感函数(比如Cost-Sensitive算法)...前4个从样本层面解决数据不平衡问题其余从算法层面解决数据不平衡问题
    

概念:
当数据不均衡的时,数据下采样,就是减少样本数量多的那种类型的样本数量
     即:剔除掉训练集中的冗余样本,使模型做到较高的可用性
当数据不均衡的时,数据上采样,就是增加样本数量少的那种类型的样本数量

1. KNN数据下采样策略

策略1

  1. 计算每个多数类点到它的K个最近邻的少数类点的平均距离
  2. 比较所有多数类点到它的K个最近邻的少数类点的平均距离,选出平均距离最小的多数类点,删除
  3. 重复以上步骤,直至删除了足够多的多数类点

该策略的本质:

	这些被删除的多数类点很可能距离少数类点较近或者处于分割的边界,区分力度较弱,可以删除

策略2

  1. 找到每个少数类点的K个最近邻(包括少数类点和多数类点),所有K近邻全部被保留
  2. 对于剩下的多数类点,计算每个点到它的M个近邻的平均距离,删除平均距离最大的点
  3. 重复以上步骤,直至删除了足够多的多数类点。

该策略的本质:

	尽可能剔除距离少数类样本较远的多数类样本,即删除离群样本

策略3

如果一对距离最近的点属于不同的类,则它们称为一个Tomek link。
对于一个Tomek link,可以:

  1. 移除其中的多数类点
  2. 将两个点全部移除

该策略的本质:

	一个Tomek link的两个点有可能是噪声或者在边界附近

策略4 Condensed Nearest Neighbor()

对于训练集中的任意一个样本A,计算其最近的同类样本和最近的非同类样本的距离

	如果A距离最近的 同类样本的距离 < 最近的非同类样本 的距离,则该样本应该被保留否则应该被删除

这个策略可以进行调整,比如:

  • 在 k 个最近邻样本中,超过80%的样本与 x 是不同类样本,即可剔除 x
  • 确定一个半径为 r 的超球体,在这个球体内的所有样本中,超过80%的样本与 x 是不同类样本,即可剔除 x

注意:以上四种策略可能会导致过度削减数据集,因此在使用时需要谨慎考虑


感谢阅读🌼
如果喜欢这篇文章,记得点赞👍和转发🔄哦!
有任何想法或问题,欢迎留言交流💬,我们下次见!
本文相关代码存放位置
    【KNN算法代码实现 + 皮马人数据集

祝愉快🌟!


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

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

相关文章

Leo赠书活动-23期 【Python数据分析】文末送书

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 赠书活动专栏 ✨特色专栏&#xff1a;…

大模型遇上心理健康咨询:MeChat、QiaoBan、SoulChat、MindChat四大心理健康领域微调模型总结

HealthX AI 2023-09-18 08:05 江苏 以下文章来源于老刘说NLP &#xff0c;作者刘焕勇 老刘说NLP. 老刘&#xff0c;NLP开源爱好者与践行者。主页&#xff1a;https://liuhuanyong.github.io。老刘说NLP&#xff0c;将定期发布语言资源、工程实践、技术总结等内容&#xff0c;…

Docker中常见的命令行

1 docker的全部命令 docker attach #连接到正在运行中的容器 docker build #使用 Dockerfile 创建镜像 docker builder #管理builds docker builder prune #清除build缓存 docker checkpoint #管理checkpoints docker checkpoint create #从正在运行的容器创建检…

求将TXT文本转换为Word文档的方法

一&#xff0c;前言 在现代办公环境中&#xff0c;文本文件的转换已成为一项常见的任务。其中&#xff0c;将TXT文本转换为Word文档是最常见的需求之一。这种转换不仅可以帮助我们更好地编辑和格式化文本&#xff0c;还可以提高文件的安全性和兼容性。本文将详细介绍如何将TXT…

开源AI引擎:自然语言处理技术在人岗匹配中的应用

一、应用场景介绍 如何从海量的求职者中精准地匹配到合适的候选人&#xff0c;是每个人力资源部门都需要解决的问题。自然语言处理&#xff08;NLP&#xff09;技术的发展为人岗匹配提供了新的解决方案。通过信息抽取和文本分类技术&#xff0c;企业可以更高效地分析职位描述和…

刷题日记——重建二叉树专题

1.层序建树 给定一个二叉树的层序遍历序列&#xff0c;空节点用#表示&#xff0c;例如层序序列&#xff1a;“abc##de#g##f###”&#xff0c;其对应二叉树如下图所示&#xff1a; 分析 创建根节点 TreeNode * rootNULL创建一个队列&#xff0c;用于保存将要插入的位置&#x…

数据结构初阶:算法的时间复杂度和空间复杂度

什么是数据结构&#xff1f; 数据结构 (Data Structure) 是计算机存储、组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系的 数据元素的集合。 什么是算法&#xff1f; 算法 (Algorithm): 就是定义良好的计算过程&#xff0c;他取一个或一组的值为输入&#xff0c…

Linux第85步_EXTI外部中断

1、在stm32mp157d-atk.dts文件中添加“led0”和“key0”节点 打开虚拟机上“VSCode”&#xff0c;点击“文件”&#xff0c;点击“打开文件夹”&#xff0c;点击“zgq”&#xff0c;点击“linux”&#xff0c;点击“atk-mp1”&#xff0c;点击“linux”&#xff0c;点击“my_l…

16.面向对象的软件测试技术

主要考点&#xff1a; 1、面向对象相关的基础概念&#xff1b;&#xff08;已经在软件工程的课程中讲过&#xff0c;要熟悉UML图&#xff0c;知道类和类之间的关系&#xff0c;这些知识也可能结合到下午题考察&#xff09; 2、面向对象的软件测试技术&#xff1b;&#xff08;大…

Keil MDK 5.37 及之后版本 安装 AC5(ARMCC) 编译器详细步骤

由于 Keil 5.37 及之后版本不再默认安装 AC5(ARMCC) 编译器&#xff0c;这就会导致由 AC5 编译的工程无法正常编译&#xff0c;往往输出窗口会提示以下信息&#xff1a;*** Target ‘STM32xxxx‘ uses ARM-Compiler ‘Default Compiler Version 5‘ which is not available. —…

苹果应用上架流程解析

苹果上架要求是苹果公司对于提交应用程序到苹果商店上架的要求和规定。这些要求主要是为了保证用户体验、应用程序的质量和安全性。以下是苹果上架要求的详细介绍&#xff1a;1. 应用程序的内容和功能必须符合苹果公司的规 苹果上架要求是苹果公司对于提交应用程序到苹果商店上…

用Python标准GUI库Tkinter绘制分形图

用Python标准GUI库Tkinter绘制分形图 分形图是一种通过迭代规则生成自相似图案的艺术形式。 分形图包括曼德勃罗集、科赫曲线、谢尔宾斯基三角等代码等。 Tkinter是Python的标准GUI库&#xff0c;可以用于创建窗口、控件和其他图形界面元素。绘制分形图像&#xff0c;如曼德…

iPhone设备中如何分析和解决应用程序崩溃日志的问题

​ 目录 如何在iPhone设备中查看崩溃日志 摘要 引言 导致iPhone设备崩溃的主要原因是什么&#xff1f; 使用克魔助手查看iPhone设备中的崩溃日志 奔溃日志分析 总结 摘要 本文介绍了如何在iPhone设备中查看崩溃日志&#xff0c;以便调查崩溃的原因。我们将展示三种不同的…

从零开始 使用OMNET++结合VEINS,INET和SUMO的联合仿真

背景知识 当我们探索未来的交通系统和智能交通解决方案时&#xff0c;车辆到一切&#xff08;Vehicle-to-Everything, V2X&#xff09;通信技术显得尤为重要。V2X是指在车辆与车辆&#xff08;V2V&#xff09;、车辆与基础设施&#xff08;V2I&#xff09;、车辆与行人&#x…

0 决策树基础

目录 1 绪论 2 模型 3 决策树面试总结 1 绪论 决策树算法包括ID3、C4.5以及C5.0等&#xff0c;这些算法容易理解&#xff0c;适用各种数据&#xff0c;在解决各种问题时都有良好表现&#xff0c;尤其是以树模型为核心的各种集成算法&#xff0c;在各个行业和领域都有广泛的…

优化页面加载时间:改善用户体验的关键

✨✨ 祝屏幕前的您天天开心&#xff0c;每天都有好运相伴。我们一起加油&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 引言 一、为什么页面加载时间重要&#xff1f; 二、如何减少页面加载时间&#xff1f; …

干部任免管理系统开发(二) 数据库表的建设

前言: 字段照搬Lrmx文件内容 数据库表字段的设计基本上就是照搬Lrmx文件内容,没有什么过多的技术含量,也可以根据自己的需要对照Lrmx文件的格式自己去定义字段了。 软件的功能截图如下&#xff1a;核心就是能够任免审批表内容读取到数据库&#xff0c;生成lrmx和word格式方便做…

SiteSucker Pro mac 5.3.2激活版 网站扒站神器

SiteSucker是一个Macintosh应用程序&#xff0c;可以从互联网自动下载网站。它通过将站点的网页、图像、PDF、样式表和其他文件异步复制到本地硬盘驱动器&#xff0c;复制站点的目录结构来实现此目的。只需输入一个URL&#xff08;统一资源定位器&#xff09;&#xff0c;按回车…

JavaScript 入门指南(三)BOM 对象和 DOM 对象

BOM 对象 BOM 简介 BOM&#xff08;browser Object Model&#xff09;即浏览器对象模型BOM 由一系列对象组成&#xff0c;是访问、控制、修改浏览器的属性的方法BOM 没有统一的标准&#xff08;每种客户端都可以自定标准&#xff09;。BOM 的顶层是 window 对象 window 对象 …

习题2-5 求平方根序列前N项和

本题要求编写程序&#xff0c;计算平方根序列 的前N项之和。可包含头文件math.h&#xff0c;并调用sqrt函数求平方根。 输入格式: 输入在一行中给出一个正整数N。 输出格式: 在一行中按照“sum S”的格式输出部分和的值S&#xff0c;精确到小数点后两位。题目保证计算结果不…