机器学习---K近邻算法

1. KNN算法

K近邻算法,即K-Nearest Neighbor algorithm,简称KNN算法,是一个理论上比较成熟的方法,也

是最简单的机器学习算法之一,1968年由 Cover 和 Hart 提出。

该方法的思路是:如果一个样本在特征空间中的 k 个最相似(即特征空间中最邻近)的样本中的大

多数属于某一个类别,则该样本也属于这个类别。KNN 算法中,所选择的邻居都是已经正确分类

的对象;该方法在分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类

别。KNN算法并不具有显式的学习过程。k=1时,为最近邻搜索。

特点:基于实例之间距离和投票表决的分类,精度高、对异常值不太敏感,计算复杂度高、空间复

杂度高,特别适合多分类,简单易实现,大多数情况下比朴素贝叶斯好,给定训练集、距离度量、

k值及分类决策函数时,其结果唯一确定。

1.1 算法流程

输入:训练数据集为实例的特征向量,实例向量x

输出:实例x所属的类别y

根据给定的距离度量,在训练集T中找出与x最近的k个点,涵盖着k个点的x的邻域记作Nk(x)

Nk(x)中根据分类决策规则(如多数表决)决定x所属的类别y。上式中,I为指示函数,即当yi=cj

时,I1,否则为0

K近邻算法中,当训练集、距离度量、k值及分类决策规则确定后,对于任何一个输入实例,它所

属的的类唯一地确定。特征空间中,对于每个训练实例点,距离该点比其他点更近的所有点组成了

一个区域,叫单元(cell)。每个训练实例点拥有一个单元,所有训练实例点的单元构成对特征空间

的一个划分。

1.2 距离度量 

特征空间是n维实数向量Rn,xi,xj∈Rn,

xi,xj的一般距离定义为闵式距离LP:

当p=2时,为欧几里得距离;当p=1时,为曼哈顿距离;当p=+∞时,为切比雪夫距离

注意:使用的距离不同,k近邻的结果也会不同的,即由不同距离度量所确定的最邻近点是不同的

1.3 K值的选择

k值得选择非常重要,对算法结果产生重要影响,如果选择的比较小的话,相当于用较小邻域中的

训练实例进行预测,学习的近似误差会减少,只有与输入实例较近的训练实例才会对预测结果起作

用,缺点是学习的估计误差会增大,易受噪声影响,极端情况是k=1。如果k值选取的比较大,相

当于用较大邻域中的训练实例进行预测,学习的估计误差会减少,但是近似误差会增大,而且与输

入实例较远的训练实例也会对预测起作用,是预测结果错误,k值的增大意味着整体模型变得简

单。因为划分的区域少了,更容易进行预测结果。极端情况是k=N。在应用中k一般取一个比较小

的值,通常采用交叉验证法来选取最优的k值。

1.4 分类决策规则

k近邻法的分类决策规则往往是多数表决,即由输入实例的k个近邻训练实例多数所属的类来决定,

如果损失函数为0-1损失,则分类函数表示为:

误分类的概率: 

实例x,最近邻居集合Nk(x),如果涵盖类别为cj,误分类率为:

目标:最小化误分类率,等价于经验风险最小化 

2. KD-Tree

k-d树是K-dimension tree的缩写,是对数据点在k维空间中划分的一种数据结构,主要应用于多维

空间关键数据的搜索(如:范围搜索和最近邻搜索)。本质上说,k-d树就是一种平衡二叉树,范

围查询就是给定查询点和查询距离的阈值,从数据集中找出所有与查询点距离小于阈值的数,K近

邻查询是给定查询点及正整数K,从数据集中找到距离查询点最近的K个数据。k-d树是一种空间划

分树,即把整个空间划分为特定的几个部分,然后在特定空间的部分内进行相关搜索操作。

特征匹配算法大致可以分为两类:

一类是线性扫描法,即将数据集中的点与查询点逐一进行距离比较,也就是穷举,缺点很明显,就

是没有利用数据集本身蕴含的任何结构信息,搜索效率较低;第二类是建立数据索引,然后再进行

快速匹配。因为实际数据一般都会呈现出簇状的聚类形态,通过设计有效的索引结构可以大大加快

检索的速度。索引树属于第二类,其基本思想就是对搜索空间进行层次划分。根据划分的空间是否

有混叠可以分为Clipping和Overlapping两种。前者划分空间没有重叠,其代表就是k-d树;后者划

分空间相互有交叠,其代表为R树。因此k近邻算法常用 k-d树实现。

split表示垂直于分割超平面的方向轴(坐标轴)序号,k-d树现在常用的有几种不同计算split的策

略:计算当前数据集上所有维度的方差,取方差最大的维度的标号作为split,对深度为j的节点,选

择l=j(mod k)+1作为split。

2.1 构造KD树

输入:k维空间数据集,其中

                      

输出:kd树

构造根节点,根节点对应于包含T的k维空间的超矩形区域:                            

split策略,计算split所对应的维度(坐标轴)x(1),以所有实例的x(1)坐标内的中位数作为切

分点,将根节点对应的超矩形区域垂直切分成两个子区域,由根节点生成深度为1的左右两个节

点,左子节点对应坐标x(1)小于切分点的子区域,右子节点对应坐标x(1)大于切分点的子区

域,将落在切分超平面上的实例点保存于根节点。

构造其它节点,递归:                      

对深度为j的节点,split策略,计算split所对应的维度(坐标轴)x(1),以所有实例的x(1)坐标

内的中位数作为切分点,将该节点对应的超矩形区域垂直切分成两个子区域,由该节点生成深度为

j+1的左右两个节点,左子节点对应坐标x(1)小于切分点的子区域,右子节点对应坐标x(1)大

于切分点的子区域,将落在切分超平面上的实例点保存于该节点,直到两个子区域没有实例时停

止,从而形成k-d树的区域划分。

2.2 k-d树的最近邻搜索

输入:已构造的kd树;目标点x

输出:x的最近邻

在kd树中找出包含目标点x的叶节点(DFS):从根节点开始,递归地向下访问kd树。若目标点x当

前维的坐标小于切分点的坐标,则移动到左子节点,否则移动到右子节点,直到子节点为叶节点为

止,在stack中顺序存储已经访问的节点。以此叶节点为“当前最近点”,然后通过stack回溯:如果

该节点保存的实例点比“当前最近点”距离目标更近,则以该实例点为“当前最近点,检查该节点的父

节点的另一个子节点对应的区域是否与以目标点为球心,以目标点与“当前最近点”间的距离为半径

的超球体相交,如果相交,则在另一个子节点对应的区域存在距离目标点更近的点,到父节点的另

外一侧,用同样的DFS搜索法,开始检查最近邻节点,如果如果不相交,则继续往上回溯,而父节

点的另一侧子节点都被淘汰,不再考虑的范围中。当搜索回到root节点时,搜索完成,得到最近邻

节点。

回溯过程实际上是一个二叉树的中序遍历,如果实例点是随机分布的,k-d树搜索平均计算复杂度

O(logN),N为实例总数,当维数较大时,直接利用k-d树快速检索的性能急剧下降。假设数据

集的维数为k,一般来说要求数据的规模N满足条件:N远大于2的k次方,才能达到高效的搜索。k

近邻的k和k-d树的k是不一样的。

2.3 基于距离加权的K近邻算法

对k近邻算法的一个显而易见的改进是对k个近邻的贡献加权,根据它们相对查询点x的距离,将较

大的权值赋给较近的近邻:

代替

其中

k近邻算法及其所有变体都只考虑k个近邻以分类查询点;如果分类一个新的查询实例时考虑所有

的训练样例,我们称此为全局(global)法。如果仅考虑最靠近的训练样例,我们称此为局部

(local)法。按距离加权的k-近邻算法是一种非常有效的归纳推理方法。它对训练数据中的噪声有

很好的鲁棒性,而且当给定足够大的训练集合时它也非常有效。注意通过取k个近邻的加权平均,

可以消除孤立的噪声样例的影响。

2.4 K近邻算法存在的问题

问题一:近邻间的距离会被大量的不相关属性所支配。

应用k近邻算法的一个实践问题是,实例间的距离是根据实例的所有属性(也就是包含实例的欧氏

空间的所有坐标轴)计算的

解决方法:当计算两个实例间的距离时对每个属性加权。

这相当于按比例缩放欧氏空间中的坐标轴,缩短对应于不太相关属性的坐标轴,拉长对应于更相关

的属性的坐标轴。每个坐标轴应伸展的数量可以通过交叉验证的方法自动决定。

问题二:k近邻算法必须保存全部数据集,如果训练数据集的很大,必须使用大量的存储空间。此

外,由于必须对数据集中的每个数据计算距离值,实际使用时可能非常耗时

问题三:在训练数据集中要求的观测值的数目,随着维数k的增长以指数方式增长。这是因为和最

近邻的期望距离随着维数k的增多而急剧上升,除非训练数据集的大小随着k以指数方式增长。

解决方法:当计算两个实例间的距离时对每个属性加权。

通过降维技术来减少维数,如主成分分析,因子分析,变量选择(因子选择)从而减少计算距离的

时间;

解决方法:当计算两个实例间的距离时对每个属性加权。

用复杂的数据结构,如搜索树去加速最近邻的确定。这个方法经常通过设定“几乎是最近邻”的目标

去提高搜索速度.

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

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

相关文章

人工智能中GAN 的五大有趣应用

引言 你能看出这张照片中面部的共同点吗? 这些人都不是真实存在的!这些面部图像都是由 GAN 技术生成的。 “GAN” 这个词是由 Ian Goodfellow 在 2014 年提出的,但相关概念早在 1990 年就存在了(Jrgen Schmidhuber 开创&#xf…

图像识别中的 Vision Transformers (ViT)

引言 Vision Transformers (ViT) 最近已成为卷积神经网络(CNN) 的竞争替代品,而卷积神经网络 (CNN) 目前在不同的图像识别计算机视觉任务中处于最先进的水平。ViT 模型在计算效率和准确性方面比当前最先进的 (CNN) 模型高出近 4 倍。 Transformer 模型已成为自然语…

【vtkWidgetRepresentation】第十七期 vtkDistanceRepresentation

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享vtkDistanceRepresentation相关内容,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 目录 前言 1. vtkDistanceRep…

ESP8266网络相框采用TFT_eSPI库TJpg_Decoder库mixly库UDP库实现图片传送

用ESP8266和TFT_ESPI模块来显示图片数据。具体来说,我们将使用ILI9431显示器作为显示设备,并通过UDP协议将图片数据从发送端传输到ESP8266。最后,我们将解析这些数据并在TFT屏幕上显示出来。在这个过程中,我们将面临一些编程挑战&…

SpringBoot+JaywayJsonPath实现Json数据的DSL(按照指定节点表达式解析json获取指定数据)

场景 若依前后端分离版手把手教你本地搭建环境并运行项目: 若依前后端分离版手把手教你本地搭建环境并运行项目_前后端分离项目本地运行-CSDN博客 在上面搭建SpringBoot项目的基础上,并且在项目中引入fastjson、hutool等所需依赖后。 Jayway JsonPat…

05. Springboot admin集成Actuator(一)

目录 1、前言 2、Actuator监控端点 2.1、健康检查 2.2、信息端点 2.3、环境信息 2.4、度量指标 2.5、日志文件查看 2.6、追踪信息 2.7、Beans信息 2.8、Mappings信息 3、快速使用 2.1、添加依赖 2.2、添加配置文件 2.3、启动程序 4、自定义端点Endpoint 5、自定…

【数据结构入门精讲 | 第十六篇】并查集知识点及考研408、企业面试练习

上一篇中我们进行了散列表的相关练习,在这一篇中我们要学习的是并查集。 目录 概念伪代码选择题填空题编程题7-1 朋友圈R7-1 笛卡尔树R7-2 部落R7-3 秀恩爱分得快 在许多实际应用场景中,我们需要对元素进行分组,并且在这些分组中进行查询和修…

常用Python自动化测试框架有哪些?优缺点对比

随着技术的进步和自动化技术的出现,市面上出现了一些自动化测试框架。只需要进行一些适用性和效率参数的调整,这些自动化测试框架就能够开箱即用,大大节省了测试时间。而且由于这些框架被广泛使用,他们具有很好的健壮性&#xff0…

代码随想录第三十九天(一刷C语言)|零钱兑换完全平方数

创作目的:为了方便自己后续复习重点,以及养成写博客的习惯。 一、零钱兑换 思路:参考carl文档 1、确定dp数组以及下标的含义:凑足总额为j所需钱币的最少个数为dp[j]。 2、确定递推公式:凑足总额为j - coins[i]的最…

先进制造身份治理现状洞察:从手动运维迈向自动化身份治理时代

在新一轮科技革命和产业变革的推动下,制造业正面临绿色化、智能化、服务化和定制化发展趋势。为顺应新技术革命及工业发展模式变化趋势,传统工业化理论需要进行修正和创新。其中,对工业化水平的判断标准从以三次产业比重标准为主回归到工业技…

WEB 3D技术 three.js 通过lil-gui 控制x y z轴数值 操作分组 设置布尔值控制 颜色材质控制

上文 WEB 3D技术 three.js 通过lil-gui管理公共事件中 我们用 lil-gui 处理了一下基础事件和按钮的管理 那么 本文 我们来具体说说它能做的其他事 我们先将基础代码改成这样 import ./style.css import * as THREE from "three"; //引入lil-gui import { GUI } fro…

web逆向经验

一、JS逆向调试流程 如果网页有跳转,必须勾选 preservelog 防止丢包看一下有没有框架 右键查看框架源代码(弹出式登陆界面)登陆尽量使用错误密码 防止跳转查看关键登陆包 分析哪些参数是加密的使用别的浏览器分析哪些参数是固定的值初步猜测加密方法搜索&#xff0…

【Java】从JDK 8迁移到JDK后续版本

自我介绍 做一个简单介绍,酒架年近48 ,有20多年IT工作经历,目前在一家500强做企业架构.因为工作需要,另外也因为兴趣涉猎比较广,为了自己学习建立了三个博客,分别是【全球IT瞭望】,【…

MySQL 事务的ACID特性

MySQL事务是什么,它就是一组数据库的操作,是访问数据库的程序单元,事务中可能包含一个或者多个 SQL 语句。这些SQL 语句要么都执行、要么都不执行。我们知道,在MySQL 中,有不同的存储引擎,有的存储引擎比如…

凸优化 2:如何判定凸函数?

凸优化 2:如何判定凸函数? 如何判断一个目标函数是凸函数?如果是凸函数,那ta的定义域是凸集合 一个函数求俩次梯度,大于等于0,那这个函数就是一个凸函数在同样条件下,怎么设计为凸函数模型&…

使用 Elasticsearch 检测抄袭 (二)

我在在之前的文章 “使用 Elasticsearch 检测抄袭 (一)” 介绍了如何检文章抄袭。这个在许多的实际使用中非常有意义。我在 CSDN 上的文章也经常被人引用或者抄袭。有的人甚至也不用指明出处。这对文章的作者来说是很不公平的。文章介绍的内容针对很多的…

【星海出品】Keepalived 使用基础案例 (二)

keepalived 使用 [rootmaster ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalivedglobal_defs { //全局配置notification_email { //定义报警收件人邮件地址acassenfirewall.locfailoverfirewall.locsysadminfirewall.loc}notification_…

ECMAScript基础入门:从语法到应用

在此之前我以及发布过关于JavaScript基础知识点大家也可以参考 大家有关于JavaScript知识点不知道可以去 🎉博客主页:阿猫的故乡 🎉系列专栏:JavaScript专题栏 🎉ajax专栏:ajax知识点 🎉欢迎关注…

redis常见数据类型

目录 1.基本全局命令 2.数据结构和内部编码 3.单线程架构 1.基本全局命令 Redis有5种数据结构,但它们都是键值对种的值,对于键来说有一些通用的命令。 KEYS 返回所有满足样式(pattern) 的key。支持如下统配样式。 h?llo 匹配 hello, hallo和hxllo h*llo匹配h…

机场信息集成系统系列介绍(6):机场协同决策支持系统ACDM

目录 一、背景介绍 1、机场协同决策支持系统是什么? 2、发展历程 3、机场协同决策参与方 4、相关定义 二、机场协同决策ACDM的建设目标 (一)机场协同决策支持系统的宏观目标 1、实现运行数据共享和前序航班信息透明化 2、实现地面资源…