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算法代码实现 + 皮马人数据集

祝愉快🌟!


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

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

相关文章

loadbalancer 引入与使用

在消费中pom中引入 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency> 请求调用加 LoadBalanced 注解 进行服务调用 默认负载均衡是轮训模式 想要切换…

OpenStack部署

目录 一、安装环境 1.无网络使用该命令 2.修改主机名 3.配置hosts解析 4.配置本机免密 5.关闭防火墙和SElinux策略 6.关闭NewworkManager 7.修改yum源 7.1下载阿里源 7.2清空并加载缓存yum源 8.安装基本工具 9.系统升级 10.安装OPenStack的yum仓库 11.修改OPenSt…

Verilog语法之assign语句学习

assign语法主要是对组合逻辑的变量进行赋值的&#xff0c;就是把一个变量赋值给另一个变量&#xff0c;被复制的变量必须是wire类型的参数。 从仿真结果可以看出&#xff0c;data_in变量的值赋值给了data_out,assign语法就是赋值没有任何延迟&#xff0c;data_in是什么值&#…

数据结构--单链表(c语言实现)

一.单链表的设计 1.单链表的结构定义: typedef struct Node{int data;//数据域struct Node* next;//后继指针 }Node,*List; 2.单链表的设计示意图: 3.注意,单链表的最后一个节点的next域为NULL; 4.为什么要有一个头节点?(简单方便,不用传二级指针); 二.单链表的实现 //初始化 …

web练习仿小米页面

效果图&#xff1a; HTML代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document…

车载电子电器架构 —— 通信信号数据库开发

车载电子电器架构 —— 信号数据库开发 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自…

rocketmq管理工具rocketmq-console安装

rocketmq-console是一个图形化管理控制台&#xff0c;提供Broker集群状态查看&#xff0c;Topic管理&#xff0c;Producer、Consumer状态展示&#xff0c;消息查询等常用功能&#xff0c;这个功能在安装好RocketMQ后需要额外单独安装、运行。 中文文档地址&#xff1a;https:/…

Java中的多线程和线程安全问题

线程 线程是操作系统进行调度的最小单位。一个进程至少包含一个主线程&#xff0c;而一个线程可以启动多个子线程。线程之间共享进程的资源&#xff0c;但也有自己的局部变量。多线程程序和普通程序的区别&#xff1a;每个线程都是一个独立的执行流&#xff1b;多个线程之间是…

C++模板进阶操作 —— 非类型模板参数、模板的特化以及模板的分离编译

非类型模板参数 模板参数可分为类型形参和非类型形参。类型形参&#xff1a; 出现在模板参数列表中&#xff0c;跟在class或typename关键字之后的参数类型名称。非类型形参&#xff1a; 用一个常量作为类&#xff08;函数&#xff09;模板的一个参数&#xff0c;在类&#xff…

【 书生·浦语大模型实战营】学习笔记(一):全链路开源体系介绍

&#x1f389;AI学习星球推荐&#xff1a; GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系的学习资料&#xff0c;配有全面而有深度的专栏内容&#xff0c;包括不限于 前沿论文解读、…

汇编语言——用INT 21H 的A号功能,输入一个字符串存放在内存,倒序输出

用INT 21H 的A号功能&#xff0c;输入一个字符串“Hello, world!”&#xff0c;存放在内存&#xff0c;然 后倒序输出。 在DOS中断中&#xff0c;INT 21H是一个常用的系统功能调用中断&#xff0c;它提供了多种功能&#xff0c;其中A号功能用于字符串的输入。 在使用这个功能时…

OSCP靶场--Internal

OSCP靶场–Internal 考点(CVE-2009-3103) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.216.40 -sV -sC -Pn --min-rate 2500 -p- Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-31 07:00 EDT Nmap scan report for 192.168.216.40 Host is up…

pymysql进行数据库各项基础操作

目录 1、mysql数据库简介2、基于mysql数据库的准备工作3、通过pymysql进行表的创建4、通过pymysql进行数据插入5、通过pymysql进行数据修改6、通过pymysql进行数据查询7、通过pymysql进行数据删除 本文内容是通过pymysql来进行时数据库的各项基础操作。 1、mysql数据库简介 …

西南交大swjtu算法实验4.2|分治

1. 实验目的 编写一个分治算法来搜索 m*n 矩阵 matrix 中的一个目标值 target&#xff0c;该矩阵 具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。 通过该实例熟悉分治算法的分析求解过程&#xff0c;时间复杂度分析方法&#xff0c;以及如何设计 分治…

基于深度学习的图书管理推荐系统(python版)

基于深度学习的图书管理推荐系统 1、效果图 1/1 [] - 0s 270ms/step [13 11 4 19 16 18 8 6 9 0] [0.1780757 0.17474999 0.17390694 0.17207369 0.17157653 0.168248440.1668652 0.16665359 0.16656876 0.16519257] keras_recommended_book_ids深度学习推荐列表 [9137…

ES6 学习(一)-- 基础知识

文章目录 1. 初识 ES62. let 声明变量3. const 声明常量4. 解构赋值 1. 初识 ES6 ECMAScript6.0(以下简称ES6)是JavaScript语言的下一代标准&#xff0c;已经在2015年6月正式发布了。它的目标&#xff0c;是使得」JavaScript语言可以用来编写复杂的大型应用程序&#xff0c;成为…

C之易错注意点转义字符,sizeof,scanf,printf

目录 前言 一&#xff1a;转义字符 1.转义字符顾名思义就是转换原来意思的字符 2.常见的转义字符 1.特殊\b 2. 特殊\ddd和\xdd 3.转义字符常错点----计算字符串长度 注意 &#xff1a; 如果出现\890,\921这些的不是属于\ddd类型的&#xff0c;&#xff0c;不是一个字符…

车载电子电器架构 —— 局部网络管理汇总

车载电子电器架构 —— 局部网络管理汇总 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明…

在 Linux(红帽系列) 中使用 yum 工具安装 Nginx 及 Nginx 的常用命令与 Nginx 服务的启动和停止

官方文档&#xff1a;https://nginx.org/en/linux_packages.html 在红帽系列的 Linux 发行版中&#xff0c;使用 yum 工具帮助我们管理和下载安装 rpm 软件包&#xff0c;并帮助我们自动解决 rpm 软件包之间的依赖关系。 关于 yum 可以参考&#xff1a;https://www.yuque.com/u…

ROS2 学习(一)ROS2 简介与基本使用

参考引用 动手学 ROS2 1. ROS2 介绍与安装 1.1 ROS2 的历史 ROS&#xff08;Robot Operating System&#xff0c;机器人操作系统&#xff09;&#xff0c;但 ROS 本身并不是一个操作系统&#xff0c;而是可以安装在现在已有的操作系统上&#xff08;Linux、Windows、Mac&…