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

news2024/11/26 2:47:54

目录

  • 一. 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.coloradmin.cn/o/1558966.html

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

相关文章

Macs Fan Control Pro--精准掌控Mac风扇,优化散热新选择

Macs Fan Control Pro是一款专为Mac电脑设计的高级风扇控制工具。它具备强大的温度监测能力&#xff0c;可以实时监测Mac电脑各个核心组件的温度&#xff0c;并通过直观的界面展示给用户。同时&#xff0c;用户可以根据个人需求自定义风扇速度&#xff0c;或者选择预设的自动风…

蓝桥杯算法题-图形排版

题目描述 小明需要在一篇文档中加入 N 张图片&#xff0c;其中第 i 张图片的宽度是 Wi&#xff0c;高度是 Hi。   假设纸张的宽度是 M&#xff0c;小明使用的文档编辑工具会用以下方式对图片进行自动排版&#xff1a; 1. 该工具会按照图片顺序&#xff0c;在宽度 M 以内&…

LabVIEW转动设备故障诊断系统

LabVIEW转动设备故障诊断系统 随着工业自动化技术的不断进步&#xff0c;转动设备在电力、化工、船舶等多个行业中扮演着越来越重要的角色。然而&#xff0c;这些设备在长期运行过程中难免会出现故障&#xff0c;如果不能及时诊断和处理&#xff0c;将会导致生产效率下降&…

【JavaSE】一维数组和二维数组详解

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 一维数组 基本语法 初始化 遍历和打印 数组是引用型变量 基本类型变量与引用类型变量的区别 null 数组传参和返回 总结 二维数组 基本语法 初始化 遍历和打印 一维数组…

排序——非基于比较的排序

本专栏和大家分享关于排序的算法,其中有插入排&#xff08;直接插入排序和希尔排序&#xff09;、选择排序&#xff08;直接选择排序和堆排&#xff09;、交换排序&#xff08;冒泡排序和快速排序&#xff09;、归并排序以及其他非基于比较的排序 本文与大家分享非基于比较的排…

透视未来安全:PIR技术引领数据隐私新时代

1.隐语实现PIR总体介绍 隐语实现的Private Information Retrieval (PIR) 是一种隐私增强技术&#xff0c;它使用户能够在不暴露他们实际查询内容的情况下从远程服务器数据库中检索所需信息。以下是隐语在实现PIR方面的概要说明和技术特点&#xff1a; 基本概念&#xff1a; PI…

移动硬盘无法读取打不开?原因分析与解决方案

一、移动硬盘遭遇困境&#xff1a;无法读取打不开 在数字信息爆炸的时代&#xff0c;移动硬盘成为了我们储存和传输数据的重要工具。然而&#xff0c;当移动硬盘突然无法读取打不开时&#xff0c;我们往往会感到手足无措。插入电脑后&#xff0c;移动硬盘的指示灯可能正常闪烁…

算法系列--动态规划--特殊的状态表示--分析重复子问题

&#x1f495;"轻舟已过万重山!"&#x1f495; 作者&#xff1a;Lvzi 文章主要内容&#xff1a;算法系列–算法系列–动态规划–特殊的状态表示–分析重复子问题 大家好,今天为大家带来的是算法系列--动态规划--特殊的状态表示--分析重复子问题 一.组合总数IV 链接…

dubbo下

dubbo 集成springboot 配置文件 controller 启动类 注册中心宕机 负载均衡 zookeeper注册中心 dubbo原理 dubbo架构 各层说明 增强spi原理

Native Instruments Kontakt 7 for Mac v7.9.0 专业音频采样

Native Instruments Kontakt 7是一款强大的软件采样器&#xff0c;它允许用户从各种来源采样音频并进行编辑和处理。它包含大量预设采样库&#xff0c;包括乐器、合成器、鼓组和声音效果等。此外&#xff0c;Kontakt 7还允许用户创建自己的采样库&#xff0c;以便根据自己的需要…

2-Prometheus监控主机

1 介绍 Prometheus 使用 node_exporter 服务程序监控 Linux 主机。 2 部署 2.1 下载 官方下载地址 https://prometheus.io/download/ 找到 node-export 下载即可 curl -o node-exporter.tar.gz -L https://github.com/prometheus/node_exporter/releases/download/v1.7.0/…

Linux非root用户安装mysql5.7

1、下载安装包MySQL :: Download MySQL Community Server 点击Archives 我下载的是5.7.27版本&#xff0c;linux主机直接选择linux-Generic即可&#xff0c;选择第一个包下载即可 2、安装mysql 解压 shell> tar xzvf mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz shell&g…

idea中Git项目遇到“Filename too long”错误 与 配置Git的ssh证书

一&#xff1a;“Filename too long”问题解决办法 错误信息&#xff1a; fatal: cannot create directory at xxxx: Filename too long warning: Clone succeeded, but checkout failed. You can inspect what was checked out with git status and retry with git restore …

【Visual Studio】将项目下的文件夹所有文件随编译自动复制输出到运行目录

要将项目根目录下的文件夹内容输出到运行目录&#xff0c;去处理其中的子文件夹和文件&#xff0c;逐个手动设置文件属性或进行复制显然不是一个可行的方法&#xff0c;因为这既繁琐又低效&#xff0c;那有没有更加高效的方式呢 文章目录 选择文件夹修改配置文件输出文件夹 这里…

二维码门楼牌管理应用平台建设:实现民主参与的新途径

文章目录 前言一、二维码门楼牌管理应用平台的兴起二、投票表决功能的实现三、居民参与度的提升四、面临的挑战与前景展望 前言 在数字化时代&#xff0c;二维码技术的应用已经渗透到我们生活的方方面面。近期&#xff0c;二维码门楼牌管理应用平台的建设成为了社区治理的一大…

Android设备无线连接电脑及QXDM、QACT等工具的方法

首先样机和笔记本电脑连接同一wifi网络 adb root adb shell ifconfig复制inet addr地址 ping inet addr地址 adb tcpip 5555 adb connect (inet addr地址):5555 此时adb和机器使用wifi连接好了&#xff0c;可以拔出usb线 ipconfig查询电脑的IP地址 ipconfig使用adb在主机上…

Qt使用opencv,进行视频录制,功能打开、关闭摄像头,开始、结束录制视频,暂停、继续录制,并保存视频文件

1.效果图 2 代码实现 2.1 .h文件 #ifndef VIDEORECORDWIDGET_H #define VIDEORECORDWIDGET_H#include <QWidget>#include<QFileDialog>#include <QImage> #include <QLabel> #include <QTimer> #include <opencv2/opencv.hpp>using name…

pytest--python的一种测试框架--fixture/YAML/parametrize

一、pytest的fixture详解 fixture概念fixture是pytest用于将测试前后进行预备、清理工作的代码处理机制。 fixture相对于setup和steardown来说有以下几个优势&#xff1a; 1.fixure命名更加灵活&#xff0c;局限性比较小。 2.conftest.py配置里面可以实现数据共享&#xff0…

数据可视化-Python

师从黑马程序员 Json的应用 Json的概念 Json的作用 Json格式数据转化 Python数据和Json数据的相互转化 注&#xff1a;把字典列表变为字符串用dumps,把字符串还原回字典或列表用loads import json#准备列表&#xff0c;列表内每一个元素都是字典&#xff0c;将其转化为Json …

【Clang+LLVM+honggfuzz学习】(一)LLVM简介、安装和第一个Hello Pass

本文结构&#xff0c;PS:根据需要选择观看哦 1. 前言参考 2.简介传统编译器架构LLVM架构 3. LLVM安装版本准备官网源码下载git下载安装过程 4. 写一个LLVM Pass旧Hello Pass实现&#xff08;legacy PM version&#xff09;新Hello Pass实现&#xff08;Using the New Pass Mana…