《机器学习》 周志华 k近邻学习
《统计学习方法》李航 k近邻法

KNN

算法思想

k-最近邻(k-Nearest Neighbour, kNN)算法是一种基本分类与回归方法,属于监督学习方法,其工作机制非常简单:给定测试样本,基于某种距离度量找出训练集中与其最靠近的 k 个训练样本,然后基于这 k 个“邻居”的信息来进行预测。在分类任务中可使用"投票法",即选择这 k 个样本中出现最多的类别标记作为预测结果;在回归任务中时使用"平均法" ,即将这 k 个样本的实值输出标记的平均值作为预测结果。还可基于距离远近进行加权平均或加权投票,距离越近的样本权重越大。
KNN是"懒惰学习" (lazy learning)的著名代表,此类学习技术在训练阶段仅仅是把样本保存起来,训练时间开销为零,待收到测试样本后再进行处理;相应的,那些在训练阶段就对样本进行学习处理的方法,称为"急切学习" (eager learning)。

三个基本要素

K值的选择

k较小→使用较小邻域中的训练实例预测→近似误差会减小、估计误差会增大→模型复杂,容易过拟合
k较大→使用较大邻域中的训练实例预测→近似误差会增大、估计误差会减小→模型简单

距离度量

欧氏距离、曼哈顿距离、闵可夫斯基距离、切比雪夫距离

决策规则

分类:多数表决,即经验风险最小化

实现

1. 线性扫描

计算输入实例与每个训练实例的距离,耗时

2. kd树方法

kd树

kd树是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构
kd树是二叉树,表示对k维空间的一个划分
kd树中的k指的是k维空间,KNN中的k指的是k个样本

构造kd树

构造kd树相当于不断地用垂直于坐标轴的超平面将k维空间切分,构成一系列的k维超矩形区域,kd树的每个结点对应于一个k维超矩形区域。

  1. 方法
    构造根结点,使根结点对应于k维空间中包含所有实例点的超矩形区域;通过下面的递归方法,不断地对k维空间进行切分,生成子结点。在超矩形区域(结点)上选择一个坐标轴和在此坐标轴上的一个切分点,确定一个超平面,这个超平面通过选定的切分点并垂直于选定的坐标轴,将当前超矩形区域切分为左右两个子区域(子结点);这时,实例被分到两个子区域。这个过程直到子区域内没有实例时终止(终止时的结点为叶结点)。在此过程中,将实例保存在相应的结点上。
    通常,依次选择坐标轴对空间切分,选择训练实例点在选定坐标轴上的中位数(median)为切分点,这样得到的kd树是平衡的。注意,平衡的kd树搜索时的效率未必是最优的。

  2. 算法

    如果中位数上没有数据点,选择与之最近的数据点

  3. 例子


搜索kd树

  1. 思想
    给定一个目标点,搜索其最近邻。首先找到包含目标点的叶结点;然后从该叶结点出发,依次回退到父结点;不断查找与目标点最邻近的结点,当确定不可能存在更近的结点时终止。这样搜索就被限制在空间的局部区域上,效率大为提高。
    包含目标点的叶结点对应包含目标点的最小超矩形区域。以此叶结点的实例点作为当前最近点。目标点的最近邻一定在以目标点为中心并通过当前最近点的超球体的内部(参阅图3.5)。然后返回当前结点的父结点,如果父结点的另一子结点的超矩形区域与超球体相交,那么在相交的区域内寻找与目标点更近的实例点。如果存在这样的点,将此点作为新的当前最近点。算法转到更上一级的父结点,继续上述过程。如果父结点的另一子结点的超矩形区域与超球体不相交,或不存在比当前最近点更近的点,则停止搜索。
  2. 算法
  3. 例子

特点

• KNN算法是最简单有效的分类算法,且容易实现。但当训练数据集很大时,需要大量的存储空间,而且需要计算待测样本和训练数据集中所有样本的距离,所以非常耗时。
• KNN对于随机分布的数据集分类效果较差,对于类内间距小,类间间距大的数据集分类效果好,而且对于边界不规则的数据效果较好。
• KNN对于样本不均衡的数据效果不好,需要进行改进。改进的方法为对k个近邻数据赋予权重,比如距离测试样本越近,权重越大。
• K值的选取非常重要。

代码

最近邻
KNN分类
KNN回归

K近邻算法(k-Nearest Neighbour, KNN)相关推荐

  1. C++实现的简单k近邻算法(K-Nearest-Neighbour,K-NN)

    C++实现的简单的K近邻算法(K-Nearest Neighbor,K-NN) 前一段时间学习了K近邻算法,对K近邻算法有了一个初步的了解,也存在一定的问题,下面我来简单介绍一下K近邻算法.本博客将从 ...

  2. 机器学习算法系列(二十二)-近似k近邻算法-Annoy(Approximate Nearest Neighbor / ANN)

    阅读本文需要的背景知识点:k近邻算法.一丢丢编程知识 一.引言   前面一节我们学习了机器学习算法系列(二十一)-k近邻算法(k-Nearest Neighbor / kNN Algorithm),其 ...

  3. k近邻算法 (KNN)

    k近邻算法 k近邻算法(KNN,K-NearestNeighbor)是一种基本分类和回归方法,监督学习算法,本质上是基于一种数据统计的方法: 核心思想:给定一个训练数据集,对新的输入实例,在训练数据集 ...

  4. python k近邻算法_python中的k最近邻居算法示例

    python k近邻算法 K最近邻居(KNN) (K-Nearest Neighbors (KNN)) KNN is a supervised machine learning algorithm t ...

  5. 机器学习[k近邻算法]

    k近邻算法简称kNN算法,由Thomas等人在1967年提出[1].它基于以下思想:要确定一个样本的类别,可以计算它与所有训练样本的距离,然后找出和该样本最接近的k个样本,统计这些样本的类别进行投票, ...

  6. java实现k 近邻算法_K近邻算法哪家强?KDTree、Annoy、HNSW原理和使用方法介绍

    1.什么是K近邻算法 K近邻算法(KNN)是一种常用的分类和回归方法,它的基本思想是从训练集中寻找和输入样本最相似的k个样本,如果这k个样本中的大多数属于某一个类别,则输入的样本也属于这个类别. 关于 ...

  7. 机器学习算法系列之K近邻算法

    本系列机器学习的文章打算从机器学习算法的一些理论知识.python实现该算法和调一些该算法的相应包来实现. 目录 K近邻算法 一.K近邻算法原理 k近邻算法 通俗解释 近邻距离的度量 k值的选择 KN ...

  8. k近邻算法,朴素贝叶斯算法,分类模型评估,模型调优

    k近邻算法,朴素贝叶斯算法,分类模型评估,模型调优 k近邻算法 k近邻算法概述 k近邻算法代码实现 k近邻算法的评价 朴素贝叶斯算法 朴素贝叶斯算法概述 朴素贝叶斯代码实现 朴素贝叶斯的评价 分类模型 ...

  9. 机器学习——聚类之k近邻算法及python使用

    聚类算法之k近邻及python使用 什么是k近邻算法 k近邻算法流程 使用sklearn进行代码实现 数据集介绍 标准化 代码实现 写在开头,套用我的老师的一句话目前所有自然学科的前沿都是在研究数学, ...

  10. python机器学习 | K近邻算法学习(1)

    K近邻算法学习 1 K近邻算法介绍 1.1算法定义 1.2算法原理 1.3算法讨论 1.3.1 K值选择 1.3.2距离计算 1.3.3 KD树 2 K近邻算法实现 2.1scikit-learn工具 ...

最新文章

  1. mysql 释放错误连接_JSP连接MySQL后数据库链接释放的错误
  2. WinCvs里登录出现C:/cvs: no such repository解决方案
  3. kafka概述与下一代消息队列
  4. 腾讯自研分布式远程Shuffle服务Firestorm正式开源
  5. (1) 在manjaro linux下安装qq,微信
  6. xshell5和xftp5安装教程
  7. jackson dataformat yaml简介及使用
  8. 方法重载overload
  9. Xcode 6 删除 DerivedData后,编译异常
  10. 国密SM2椭圆曲线密码算法
  11. win7计算机管理中看不到新加的硬盘,win7系统看不到第二块硬盘的解决方法.
  12. pytest常用参数
  13. 10019---初探JVM
  14. day55 虚拟机 centos linux命令 搭建linux架构师必背命令
  15. kotlin用it还是this?
  16. 小米平板4 android版本,小米平板4/4Plus通刷-LOS-安卓9.0.0-稳定版Stable2.0-来去电归属-农历等-本地化增强适配...
  17. C++对于文件的操作(4)——更改文件指定位置的数据(在新旧数据长度不一致的情况下)
  18. 【基础编程】猜数字游戏的提示
  19. 如何把matlab里的字符串按照顺序排列好
  20. gradle初始化失败:Errors occurred while build effective model from

热门文章

  1. java 读取文件内容 方法
  2. 测试篇之一 sd卡独写速度测试
  3. 易语言删除c盘源码,易语言基础教程利用API删除自身及子文件
  4. 个人主页博客网页设计制作HTML5+CSS大作业——清新春暖花开个人博客网站(6页)
  5. 【面试指南】如何看待你的竞争对手30k,而你却3k?想要高薪,我们也要学会拧螺丝、造飞机的能力
  6. 30岁了还可以学java吗_30岁还能零基础学Java吗?
  7. 软件技术专业的简历编写记录
  8. 定义一个工资变量c语言,《工资管理》c语言程序设计.doc
  9. 网站上传服务器及安装包,如何上传安装包到服务器
  10. tp ajax 多图上传,TP5 Ajax上传图片