k近邻算法 订阅
K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:在特征空间中,如果一个样本附近的k个最近(即特征空间中最邻近)样本的大多数属于某一个类别,则该样本也属于这个类别。 展开全文
K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:在特征空间中,如果一个样本附近的k个最近(即特征空间中最邻近)样本的大多数属于某一个类别,则该样本也属于这个类别。
信息
地    位
最简单的机器学习算法之一
不    足
计算量较大
中文名
k近邻算法
外文名
k-Nearest Neighbour,KNN
k近邻算法概念介绍
用官方的话来说,所谓K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居), 这K个实例的多数属于某个类,就把该输入实例分类到这个类中。
收起全文
精华内容
下载资源
问答
  • K 近邻算法

    2017-09-18 22:00:17
    所谓K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居), 这K个实例的多数属于某个类,就把该输入实例分类到这个类中。
  • 机器学习实战_K近邻算法 ——手写数字预测 调用的是自己编写的分类器classify0,主要是为了学习理论原理;在实际是项目中通常调用工具包的api接口,比如sklearn,这也体现了python的一个便利性,不用总是自己造轮子...
  • 本文给大家分享的是一段GO语言利用K近邻算法实现小说鉴黄的方法,本方法的鉴别的关键是关键是向量点的选择和阈值的判定,推荐给大家,有需要的小伙伴可以参考下。
  • K近邻算法的MATLAB实现

    2018-04-16 23:29:22
    KNN的MATLAB实现,基于特殊的SONAR数据,M文件,MATLAB源代码
  • 主要介绍了python K近邻算法的kd树实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • k近邻算法的Python实现

    2018-07-19 13:58:46
    可以直接运行的Python程序,里面包含了数据集和测试集,有利于初学者入门。
  • K近邻算法-讲解

    2019-06-17 17:59:44
    k近邻算法 用于多媒体信息处理 一种算法 人工智能 PPT
  • 基于改进K-means的K近邻算法在电影推荐系统中的应用.pdf
  • 在Python环境下,使用MNIST数据集,实现KNN算法,对MNIST数据集中数据进行HOG特征提取,再进行预测,准确率较高
  • k近邻算法和朴素贝叶斯算法课件
  • K近邻算法手写识别系统
  • K近邻算法进行手写识别的数据集,包含手写数字的训练集和测试集,为32*32的数据集合,在代码里转为1024的向量
  • python K近近邻邻算算法法的的kd树树实实现现 这篇文章主要介绍了python K近邻算法的kd树实现小编觉得挺不错的现在分享给大家也给大家做个参考 一起跟随小编过 看看吧 k近近邻算算法法的的介介绍 k近邻算法是一种...
  • python实现,具体代码讲解请看博主博客,博主名称:u010665216,文章在机器学习专栏,文章名称:K近邻算法讲解、python实现、k值的确定
  • PARZEN窗和K近邻算法的python实现。 现实生活中常常会有这样的问题:缺乏足够的先验知识,因此难以人工标注类别或进行人工类别标注的成本太高。很自然地,我们希望计算机能代我们完成这些工作,或至少提供一些帮助...
  • k近邻算法

    万次阅读 2018-10-07 16:20:28
    本文来自的CSDN 博客 ,全文地址请点击:...可能有人会说,K近邻模型有什么好写的,那分明就是一个最简单的机器学习模型,哦,不,连机器学习也算不上的算法吧。但是这里,我想提醒的是,我们...

    本文来自的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/qq_35082030/article/details/60965320?utm_source=copy

    0. 写在前面

    在这一讲的讨论班中,我们将要讨论一下K近邻模型。可能有人会说,K近邻模型有什么好写的,那分明就是一个最简单的机器学习模型,哦,不,连机器学习也算不上的算法吧。但是这里,我想提醒的是,我们要讨论的,不仅仅是简单的K近邻模型,而是和它相关的一些有困惑的话题。

    1. K近邻定义

    k近邻算法,也成为KNN算法,是一种基本分类与回归算法。它在基本实现上,使用的是多数表决的惰性学习过程。也就是它实际上是基于记忆的学习方法。它并没有学出一个什么判别模型,其实也没有像贝叶斯那样算出一个新东西,而是简单的统计距离目标点最近的K个节点里数目最多的标签赋予目标点。就是这么一个简单的算法。我们这里给出一个最朴素的K近邻算法:
    K近邻算法
    输入:训练数据集T=(x1,y1),(x2,y2),...(xN,yN)T=(x1,y1),(x2,y2),...(xN,yN)
    输出:实例x所属的类y
    算法步骤:
    (1)根据给定的距离度量,在训练集T中找出与x最近邻的k个点,涵盖这k个点的x的邻域记作Nk(x)Nk(x)
    (2)在Nk(x)Nk(x)中根据分类决策规则,如多数表决决定x的类别y。

    1.k近邻模型

    k近邻模型的核心就是使用一种距离度量,获得距离目标点最近的k个点,根据分类决策规则,决定目标点的分类。

    就是这么三句话,决定了k近邻模型的三个基本要素——距离度量、k值的选择、分类决策规则。

    2. 距离度量

    一个点和一个点之间的距离,无论是什么计算方式,基本上离不开LpLp距离。我们熟知的欧式距离,则是L2L2范式,也就是p=2的情况,而另一个很熟悉的距离曼哈顿距离,则是L1L1范式。LpLp距离的定义如下:

    Lp(xi,xj)=(∑l=1n|x(l)i−x(l)j|p)1pLp(xi,xj)=(∑l=1n|xi(l)−xj(l)|p)1p


    当然,如果p→∞的时候,就叫做切比雪夫距离了。
    除了这个闵可夫斯基距离集合外,还有另外的距离评估体系,例如马氏距离、巴氏距离、汉明距离,这些都是和概率论中的统计学度量标准相关。而像夹角余弦、杰卡德相似系数、皮尔逊系数等都是和相似度有关的。

     

    因此,简单说来,各种“距离”的应用场景简单概括为,空间:欧氏距离,路径:曼哈顿距离,国际象棋国王:切比雪夫距离,以上三种的统一形式:闵可夫斯基距离,加权:标准化欧氏距离,排除量纲和依存:马氏距离,向量差距:夹角余弦,编码差别:汉明距离,集合近似度:杰卡德类似系数与距离,相关:相关系数与相关距离。

    这其实只是个度量标准而已,应当根据数据特征选择相应的度量标准。

    3. k值的选择

    k值的选择也很有必要,因为k的选择小了,则近似误差会减小,但估计误差会增大;相反k的选择大了,则近似误差会增大,估计误差会减小。这一点,我们会在近似误差与估计误差那一部分进一步讲解。

    4. 分类决策规则

    k近邻的分类决策规则是最为常见的简单多数规则,也就是在最近的K个点中,哪个标签数目最多,就把目标点的标签归于哪一类。

    实际上,也是可行的,也是唯一可行的分类决策规则。无论是全体一致规则(一票否决制)还是绝对多数规则,都不能在任何时候对目标点做出确切的预测,更不用提少数原则这种不靠谱的决策规则了。

    当然,这也是有理论依据的:
    如果分类的损失函数为0-1损失函数,则误分类的概率是:

    P(Y≠f(X))=1−P(Y=f(X))P(Y≠f(X))=1−P(Y=f(X))


    也就是说误分类率为:

    1k∑I(yi≠cj)=1−1kI(yi=cj)1k∑I(yi≠cj)=1−1kI(yi=cj)


    要使得误分类率最小,也就是经验风险最小,就要使得1kI(yi=cj)1kI(yi=cj)最大,所以多数表决规则等价于经验最小化。

     

    其实,还可以使用权重加权的多数表决,对于K个最近点,根据其距离的远近来进行加权统计,从而获得一个折中的效果。本方法为个人所想,不知有没有实践来论证。

    2. 估计误差与近似误差

    1.估计误差

    估计误差我们应该在初中或者高中物理的时候就已经学过了,也许只是忘记了而已。估计误差主要包含四个部分:系统误差、随机误差、过失误差、精密度和精确度。

    就我们K近邻来讲,如果K值比较小,那么例如像噪点,错误的数据,不恰当的度量标准以及数据本身的缺陷等,都会很大程度上影响最终的结果,而如果K值比较大,那么以上缺陷就会尽可能的平均,从而减小对最终结果的影响。

    2.近似误差

    近似误差与估计误差的描述对象不同,估计误差度量的是预测结果与最优结果的相近程度,而近似误差是度量与最优误差之间的相似程度。就K近邻算法来讲,K值越小,那么与目标点相近的点的标签对于其目标点的影响也就越大,其标签的一致性就越高,这样近似误差就会变小。

    3.两者区别与联系

    总而言之,近似误差指的是目标点对于其原样本点的可信度,误差越小,对于原样本点的信任度越高,也就是说,目标点可能只需要对最近的点确认一次就可以标注自己的标签,而无需去询问其他目标点。而估计误差则是原模型本身的真实性,也就是说,该模型所表现出的分类特性,是不是就是真实的分类特性,比如有噪点影响,有错误数据记录,或者本身数据分布就不是很好,都会是影响估计误差的因素,而询问的点越多,那么这些坏点对于目标点的标签影响就越小。

    这就像是你向别人征求意见,你对于别人意见的采纳率越高,则别人意见的近似误差越小。而别人意见越符合实际情况,则估计误差越小。这么说应该有个大致的理解了吧。

    3. K近邻的实现kd树

    我们通过上述描述,应该清楚了一个K近邻算法的基本运作思想,由于没有训练过程,没有预测模型,使得K近邻算法的计算量十分巨大,因为它需要把所有的样本点都和目标点进行一次距离度量,很难适应大规模的数据样本。那么kd树就应运而生了。

    1. kd树定义

    kd树,指的是k-dimensional tree,是一种分割K维数据空间的数据结构,主要用于多维空间关键数据的搜索。kd树是二进制空间分割树的特殊情况。

    索引结构中相似性查询有两种基本的方式:一种是范围查询,另一种是K近邻查询。范围查询就是给定查询点和查询距离的阈值,从数据集中找出所有与查询点距离小于阈值的数据;K近邻查询是给定查询点及正整数K,从数据集中找到距离查询点最近的K个数据,当K=1时,就是最近邻查询。

    而对于这类问题,解决办法有两类:一类是线性扫描法,即将数据集中的点与查询点逐一进行距离比较,也就是穷举,缺点很明显,就是没有利用数据集本身蕴含的任何结构信息,搜索效率较低,第二类是建立数据索引,然后再进行快速匹配。因为实际数据一般都会呈现出簇状的聚类形态,通过设计有效的索引结构可以大大加快检索的速度。索引树属于第二类,其基本思想就是对搜索空间进行层次划分。根据划分的空间是否有混叠可以分为Clipping和Overlapping两种。前者划分空间没有重叠,其代表就是k-d树;后者划分空间相互有交叠,其代表为R树。

    但是要说明的是kd树的朴素用法,只能解决最近邻算法,对于K近邻算法还需要改进后才能够使用,这里我们放到最后再讲。

    2. kd树的构造算法

    构造kd树的方法根据不同的决策规则分为很多种,但最终都是平衡二叉树。具体方法如下:
    1. 构造根节点,使根节点对应用于K维空间中包含所有实例点的超矩形区域。
    2. 通过下面的递归方法,不断切分K维空间,生成子节点:
    1) 在超矩形区域上选择一个坐标轴和该坐标上的一个切分点,确定一个超平面。
    2)以经过该点且垂直于该坐标轴做一个超平面,该超平面将当前的超矩形区域切分成左右两个子区域,实例被分到两个子区域。
    3.该过程直到子区域内无实例时终止(终止时的节点为子节点)。
    在此过程中将实例集合保存在相应的节点上。

    在这个方法中,有两个部分时可以进行调节的,第一个部分就是选取的维度的顺序,另一个部分就是选取分割点的度量标准。

    在第一部分,我们可以使用顺序采样,即从第1维,第2维,第n维一直到分割完毕为止。也可以使用最大方差所在的维度,也可以使用维度主次优先级为顺序,以此等等。

    在第二部分,我们可以使用的是所在维度的中位数作为切分点,也可以使用中值作为切分点,以此等等。

    这里,我们使用的是最朴素的方法,维度采用顺序采样,切分点选取中位数作为切分点,来描述一下kd树构造算法。

    kd树构造算法
    输入:k维空间数据集T = x1,x2,…,xNx1,x2,…,xN,其中,xi=(x(1)i,x(2)i,…,x(k)i),i=1,2,…,Nxi=(xi(1),xi(2),…,xi(k)),i=1,2,…,N
    输出:kd树
    开始:

    1. 构造根节点(根节点对应于包含T的K维空间的超矩形区域)
      选择x(1)x(1)为坐标轴,以T中所有实例的x(1)x(1)坐标的中位数为切分点,这样,经过该切分点且垂直与x(1)x(1)的超平面就将超矩形区域切分成2个子区域。保存这个切分点为根节点。

    2. 重复如下步骤:
      对深度为j的节点选择x(l)x(l)为切分的坐标轴,l=j(modk)+1l=j(modk)+1 ,以该节点区域中所有实例的x(l)x(l)坐标的中位数为切分点,将该节点对应的超平面切分成两个子区域。切分由通过切分点并与坐标轴x(l)x(l)垂直的超平面实现。保存这个切分点为一般节点。

    3. 直到两个子区域没有实例存在时停止。

      具体的例子大家可以看一下书,我们的重点不在于此。对于书上的例子,一句话概括为:偶数层以第一维为二分检索树,奇数层以第二维为二分检索树。对于n个实例的k维数据来说,建立kd-tree的时间复杂度为O(k×n×logn)。

      而对于kd树的插入删除等不在我们这堂课的讨论范围内,大家可以课后自己查阅资料,因为这方面比较复杂。

      对于kd树的插入来说,就相当于一个随时改变比较维度的二叉检索树:在偶数层比较x坐标值,而在奇数层比较y坐标值。当我们到达了树的底部,(也就是当一个空指针出现),我们也就找到了结点将要插入的位置。

      这一部分感兴趣的同学可以更深入的研究一下。

    3. kd树的检索算法

    既然已经建成了kd树了,那么kd树的检索算法就被提上议程,这次,我们使用的就是针对上面的kd树构建算法而写出的kd树检索算法:

    kd树最近邻搜索算法
    输入:已构造的kd树:目标点x;
    输出:x的最近邻。

    (1)在kd树中找出包含目标点x的叶结点:从根结点出发,递归的向下访问kd树。若目标点x当前维的坐标小于切分点的坐标,则移动到左子结点,否则移动到右子节点,直到子节点为叶结点为止。
    (2)以此叶节点为“当前最近点”。
    (3)递归的向上回退,在每个结点进行以下操作:
    (a) 如果该结点保存的实例点比当前最近点距离目标点更近,则以该实例点为“当前最近点”。
    (b) 当前最近点一定存在于该结点一个子结点对应的区域。检查该子结点的另一子结点对应的区域是否有更近的点。
    具体的,检查另一子结点对应的区域是否与以目标点为球心,以目标点与“当前最近点”间的距离为半径的超球体相交。
    如果相交,可能在另一个子结点对应的区域内存在距离目标点更近的点,移动到另一个子结点,接着,递归地进行最近邻搜索。
    如果不相交,向上回退。
    (4)当回退到根结点时,搜索结束,最后的“当前最近点”即为x的最近邻点。

    这样,其实只要把握住了这么个几个部分,首先,是当前最近点的初始值的确定,第二,如何回溯比较,第三,如何搜索可能存在的解。

    总而言之,若实例点随机分布,则KD树搜索的时间复杂度为O(logN),N为训练实例数。就具体而言,KD树更适用于训练实例数远大于空间维度的K近邻搜索。一般是20维以下的,效果比较好。

    4. 关于K近邻算法的若干其他问题

    关于K近邻算法还有很多更加深入的问题,我们在下面进行简要的讨论,在以后有时间时,我们会针对某些具体的问题,做出专题讲解。

    1. K近邻算法与K-means聚类算法的区别

    K近邻算法和K均值聚类算法看起来十分相似,不过还是有一些区别的,我们这里给出一张表:

    KNNK-Means
    KNN是分类算法K-Means是聚类算法
    KNN是监督学习K-Means非监督学习
    没有明显的前期训练过程有明显的前期训练过程
    K的含义指的是判断依据来源个数K的含义是集合的分类数目

    而这两者都用到了NN算法,一般使用kd树来实现。

    2. 如何使用kd树来进行K近邻查找

    这道题是课后习题第三题,网上说通过维护一个包含 k 个最近邻结点的队列来实现,就我个人想法而言,实际上,主要是看这些队列里的值从何而来。我认为,这些较近的点是来源于那些最近邻点可能存在的点的集合中,也就是最近邻点的父节点以及跨越了超球面的那些区域内的点及他们的父节点。

    也就是说,只需要改动这么几个步骤,就是在与最近邻点相比较的所有节点都可以存入到k近邻队列中,然后队列未满时,其最短距离为∞,队列已满时,其最短距离为队列中最长的结点的距离。一旦新来的结点小于这个最长距离,则删除最长结点,插入新来的结点,并且更新队列的最短距离。

    一般来讲,如果k比较小,那么常规kd树检索已经足够查到K个近邻点。但是如果发生了没有找全k个最小的,可以在另一半的树中查找剩下的近邻点。

    3. 课后习题3.1

    课后题目3.1描述如下:

    参照图3.1,在二维空间中给出实例点,画出k为1和2时的k近邻法构成的空间划分,并对其进行比较,体会k值选择与模型复杂度及预测准确率的关系。

    我们不去考虑k为1的情况,因为k为1的情况我们可以很容易从原图中获取,我们来考虑k=2时候的空间划分。

    我们都知道,在2维空间中,我们通常使用的是一条线来进行2分类,这也是最优的分类方式(每次减小样本空间一半),那么在这个题目中,如果k=2的时候,我们考虑最近的3个点开始,其实无论是多少都没关系的,只不过时间复杂度比较大,但是我们通常不会选取过多的候选点.

    现在,这条线就是2个点的连线的垂直平分线,如下图所示:
    2个点的图片
    为了更清楚,我把图片放大,以至于A,B点变成了圆,l为AB两点连线的垂直平分线。如图上所标,这时候只能考虑k=1d的时候的划分。一条垂直平分线可以把平面分成两个部分,左边红色的部分都会被归结为离A点近,右边的蓝色部分都会被归结于B点近。

    那么如果我们考虑三个点的k近邻,如下图所示:
    三个点

    如果K=1,那么最终的分类就会是如此,蓝色的点都是被归于点A,红色的点都归于点B,紫色的点都归于点C,但是如果是K=2的时候呢?K=2的时候,只需要把垂直平分线延长就可以了,如下图:

    三种颜色

    为了区分归属,我把三个点都标上了颜色,而被划分的6个区域,其最近的2个点的颜色都在图上标出,其实就是一个二维层面的三次切分,取其中最近的2个点。这样就得到了空间划分。

    实际上4个点,5个点,n个点都是同样的道理,这个算法不一定是最优的,但是是可以推广到n个点的普适算法,而且又由于k的取值不会过大,因此不会造成大数灾难。

    你可能觉得很巧,为什么所有的垂直平分线都会交于一点,实际上,所有的凸多边体都会有一个外接圆,那么圆心到所有点的距离都相等,这就是所有边的垂直平分线的焦点。但是对于凹多边体,就没有外接圆了,但是也不用担心,空间中所有的部分都会被若干个垂直平分线所分割,只需要比较围成这个区域的n个垂直平分线,然后再根据k的取值取前K个点即可。

    这样就解决了题目3.1。

    4. kd树的若干改进算法

    但是事实上,即使我们上面的Kd树可以完成k近邻的查找,但是对于大数据来讲,仍然是效率不够的。

    1. BBF算法

    那么一个最基本的改进就可以被提出了,那就是BBF(Best-Bin-First)查询算法。这个算法是由发明sift算法的David Lowe在1997的一篇文章中针对高维数据提出的一种近似算法,此算法能确保优先检索包含最近邻点可能性较高的空间,此外,BBF机制还设置了一个运行超时限定。采用了BBF查询机制后,kd树便可以有效的扩展到高维数据集上。
    BBF算法的改进思路为:将“查询路径”上的结点进行排序,如按各自分割超平面(也称bin)与查询点的距离排序,也就是说,回溯检查总是从优先级最高(Best Bin)的树结点开始。

    2.球树

    仅仅在kd树上进行BBF算法的改进,仍然还是不能够避免一些结构本身存在的弊端,当处理不均匀分布的数据集时便会呈现出一个基本冲突:既要求树有完美的平衡结构,又要求待查找的区域近似方形,但不管是近似方形,还是矩形,甚至正方形,都不是最好的使用形状,因为他们都有角。

    其实这个问题的实质是因为,我们对于距离的度量使用的是圆形,也就是欧氏距离,如果是我们之前提到的像切比雪夫距离这种方形的,就可以在一定程度上减少这个冲突。因为无论是你的模板和样本,其度量标准是一致的,也就是要么是方形的,都是方形的,要是圆形的,都是圆形的。
    例如下面这个就是球树:
    球树
    从球中选择一个离球的中心最远的点,然后选择第二个点离第一个点最远,将球中所有的点分配到离这两个聚类中心最近的一个上,然后计算每个聚类的中心,以及聚类能够包含它所有数据点所需的最小半径。这种方法的优点是分裂一个包含n个殊绝点的球的成本只是随n呈线性增加。

    使用球树找出给定目标点的最近邻方法是,首先自上而下贯穿整棵树找出包含目标点所在的叶子,并在这个球里找出与目标点最靠近的点,这将确定出目标点距离它的最近邻点的一个上限值,然后跟KD树查找一样,检查同胞结点,如果目标点到同胞结点中心的距离超过同胞结点的半径与当前的上限值之和,那么同胞结点里不可能存在一个更近的点;否则的话,必须进一步检查位于同胞结点以下的子树。

    5. 小结

    在本次讨论课上,我们对于K近邻算法有了一个直观的认识,并且针对一些特定的问题,我们也做了一些深入的了解和探究,但是这还远远不够,一些问题我们仍然没有展开来说,例如度量标准中的那些距离的具体表现形式,还有没有给出k近邻算法的一些实例,以及kd树的数据结构和实际运行代码。

     

    展开全文
  • KNN的MATLAB实现,基于特殊的SONAR数据,M文件,MATLAB源代码。
  • K近邻算法java实现

    2015-11-16 20:57:06
    数据挖掘课程实验作业,在参考网上一些资源的情况下完成的,实验结果正确率达将近百分之九十
  • 基于k近邻算法的手写数字识别,K近邻学习(kNN)是一种常见的监督学习方法,给定测试样本,基于某种距离度量找出训练集中与其最靠近的k个训练样本,然后基于这k个“邻居”的信息来进行预测。通常在分类任务中可使用...
  • K近邻算法

    2018-06-28 10:51:57
    其它机器学习、深度学习算法的全面系统讲解可以阅读《机器学习-原理、算法与应用》,清华大学出版社,雷明著,由SIGAI公众号作者倾力打造。 书的购买链接 书的勘误,优化,源代码资源 原创声明:本文为 SIGAI 原创...

    其它机器学习、深度学习算法的全面系统讲解可以阅读《机器学习-原理、算法与应用》,清华大学出版社,雷明著,由SIGAI公众号作者倾力打造。

    原创声明:本文为 SIGAI 原创文章,仅供个人学习使用,未经允许,不能用于商业目的。

     

    我们在网上购买水果的时候经常会看到同一种水果会标有几种规格对应不同价格进行售卖,水果分级售卖已经是电商中常见的做法,那么水果分级具体是怎么操作的呢?一种简单的做法是根据水果果径的大小进行划分。今年老李家苹果丰收了,为了能卖个好价钱,老王打算按照果径对苹果进行分级。想法是很好的,但是面对成千上万的苹果这可愁坏了老李。老李的儿子小李是计算机系毕业的,他知道这件事后设计了一个算法,按照老李的要求根据果径大小定义了5个等级

    70mm左右(<72.5mm)
    75mm左右(>=72.5mm&&<77.5mm)
    80mm左右(>=77.5mm&&<82.5mm)
    85mm左右(>=82.5mm&&<87.5mm)
    90mm左右(>=87.5mm)

    如下图:

    当一个未分级的苹果拿到后可以首先将这个苹果的果径测量出来,然后再和这5个等级的苹果进行对照,假如未分级苹果的果径是82mm则划分为第三个等级,如果是83mm则划分为第二个等级,以此类推。基于这个原则小李发明了一个分级装置,见下图,大大提高了工作效率,很快将老李的问题解决了。

    老李的问题是一个经典的最近邻模板匹配,根据一个已知类别参考模板对未分类的数据进行划分,小李选择的每个类的模板数是一,现实生活中的问题往往会复杂很多,可能需要多个参考模板进行综合决策,当选定的模板数为k的时候就是k近邻算法的思想了,最近邻算法是k近邻算法k=1时的一种特殊情况。

    k近邻算法简称kNN算法,由Thomas等人在1967年提出[1]。它基于以下思想:要确定一个样本的类别,可以计算它与所有训练样本的距离,然后找出和该样本最接近的k个样本,统计这些样本的类别进行投票,票数最多的那个类就是分类结果。因为直接比较样本和训练样本的距离,kNN算法也被称为基于实例的算法。

    基本概念

    确定一个样本所属类别的一种最简单的方法是直接比较它和所有训练样本的相似度,然后将其归类的最相似的样本所属的那个类,这是一种模板匹配的思想。下图6.1是使用k近邻思想进行分类的一个例子:

    图6.1 k近邻分类示意图

    在上图中有红色和绿色两类样本。对于待分类样本即图中的黑色点,我们寻找离该样本最近的一部分训练样本,在图中是以这个矩形样本为圆心的某一圆范围内的所有样本。然后统计这些样本所属的类别,在这里红色点有12个,圆形有2个,因此把这个样本判定为红色这一类。上面的例子是二分类的情况,我们可以推广到多类,k近邻算法天然支持多类分类问题。

    预测算法

    k近邻算法实现简单,缺点是当训练样本数大、特征向量维数很高时计算复杂度高。因为每次预测时要计算待预测样本和每一个训练样本的距离,而且要对距离进行排序找到最近的k个样本。我们可以使用高效的部分排序算法,只找出最小的k个数;另外一种加速手段是k-d树实现快速的近邻样本查找。

    一个需要解决的问题是参数k的取值。这需要根据问题和数据的特点来确定。在实现时可以考虑样本的权重,即每个样本有不同的投票权重,这称方法称为为带权重的k近邻算法。另外还其他改进措施,如模糊k近邻算法[2]。

    距离定义

    根据前面的介绍,kNN算法的实现依赖于样本之间的距离值,因此需要定义距离的计算方式。接下来介绍常用的几种距离定义,它们适用于不同特点的数据。

     

    常用距离定义

     

    这是我们最熟知的距离定义。在使用欧氏距离时应该尽量将特征向量的每个分量归一化,以减少因为特征值的尺度范围不同所带来的干扰。否则数值小的特征分量会被数值大的特征分量淹没。例如,特征向量包含两个分量,分别为身高和肺活量,身高的范围是150-200厘米,肺活量为2000-9000,如果不进行归一化,身高的差异对距离的贡献显然为被肺活量淹没。欧氏距离只是将特征向量看做空间中的点,并没有考虑这些样本特征向量的概率分布规律。

    要保证根号内的值非负,即矩阵S必须是半正定的。这种距离度量的是两个随机向量的相似度。当矩阵S为阶单位矩阵I时,Mahalanobis距离退化为欧氏距离。矩阵可以通过计算训练样本集的协方差矩阵得到,也可以通过训练样本学习得到,优化某一目标函数。

    对于矩阵如何确定的问题有不少的研究,代表性的有文献[9-12],其中文献[9]提出的方法具有很强的指导意义和应用价值。文献[9]指出,kNN算法的精度在很大程度上依赖于所使用的距离度量标准,为此他们提出了一种从带标签的样本集中学习得到距离度量矩阵的方法,称为距离度量学习(Distance Metric Learning),我们将在下一节中介绍。

    Bhattacharyya距离定义了两个离散型或连续型概率分布的相似性。对于离散型随机变量的分布,它的定义为:

    距离度量学习

    Mahalanobis距离中的矩阵S可以通过对样本的学习得到,这称为距离度量学习。距离度量学习通过样本集学习到一种线性变换,目前有多种实现。下面我们介绍文献[9]的方法,它使得变换后每个样本的k个最近邻居都和它是同一个类,而不同类型的样本通过一个大的间隔被分开,这和第8章将要介绍的线性判别分析的思想类似。如果原始的样本点为x,变换之后的点为y,在这里要寻找的是如下线性变换:

    为了保证kNN算法能准确的分类,任意一个样本的目标邻居样本要比其他类别的样本更接近于该样本。对每个样本,我们可以将目标邻居想象成为这个样本建立起了一个边界,使得和本样本标签值不同的样本无法入侵进来。训练样本集中,侵入这个边界并且和该样本不同标签值的样本称为冒充者(impostors),这里的目标是最小化冒充者的数量。

    为了增强kNN分类的泛化性能,要让冒充者离由目标邻居估计出的边界的距离尽可能的远。通过在kNN决策边界周围加上一个大的安全间隔(margin),可以有效的提高算法的鲁棒性。

     

    同类样本尽量都成为最近的邻居节点;而不同类型的样本会拉开距离。这会有效的提高kNN算法的分类精度。

    实验程序

    下面用一个例子程序来演示kNN算法的使用,这里我们对2个类进行分类。

     

    图6.2 kNN算法的分类效果

    在这里分类边界是曲线,证明了kNN算法有非线性分类的能力。以上结果来自SIGAI云端实验室,如果你对此感兴趣,可以向SIGAI公众号发消息,申请使用。我们的实验室提供了强大的功能,可以帮助大家更容易,深刻的理解各种数学,机器学习,深度学习,以及应用领域的算法。

    应用

    kNN算法简单但却有效,如果能够定义合适的距离度量,它可以取得很好的性能。kNN算法被成功的用于文本分类[5-7],图像分类[8-11]等模式识别问题。应用kNN算法的关键是构造出合适的特征向量以及确定合适的距离函数。

    参 考 文 献

    [1] Thomas M Cover, Peter E Hart. Nearest neighbor pattern classification. IEEE Transactions on Information Theory, 1967.

    [2] James M Keller, Michael R Gray, James Givens. A fuzzy K-nearest neighbor algorithm. systems man and cybernetics, 1985.

    [3] Thierry Denoeux. A k-nearest neighbor classification rule based on Dempster-Shafer theory. systems man and cybernetics, 1995

    [4] Trevor Hastie, Rolbert Tibshirani. Discriminant adaptive nearest neighbor classification. IEEE Transactions on Pattern Analysis and Machine Intelligence, 1996.

    [5] Bruno Trstenjak, Sasa Mikac, Dzenana Donko. KNN with TF-IDF based Framework for Text Categorization. Procedia Engineering, 2014.

    [6] J He, Ahhwee Tan, Chew Lim Tan. A Comparative Study on Chinese Text Categorization Methods. pacific rim international conference on artificial intelligence, 2000.

    [7] Shengyi Jiang, Guansong Pang, Meiling Wu, Limin Kuang. An improved K-nearest-neighbor algorithm for text categorization. 2012, Expert Systems With Application.

    [8] Oren Boiman, Eli Shechtman, Michal Irani. In defense of Nearest-Neighbor based image classification. 2008, computer vision and pattern recognition.

    [9] Kilian Q Weinberger, Lawrence K Saul. Distance Metric Learning for Large Margin Nearest Neighbor Classification. 2009, Journal of Machine Learning Research.

    [10] S. Belongie, J. Malik, J. Puzicha. Shape matching and obejct recognition using shape contexts. IEEE Transactions on Pattern Analysis and Machine Intelligence, 24(4):509-522, 2002.

    [11] P. Y. Simard, Y. LeCun, I. Decker. Efficient pattern recognition using a new transformation distance. In S. Hanson, J. Cowan, and L. Giles, editors, Advances in Neural Information Processing Systems 6, pages 50-58, San Mateo, CA, 1993. Morgan Kaufman.

    [12] S. Chopra, R. Hadsell, Y. LeCun. Learning a similarity metric discriminatively, with application to face verification. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR 2005), pages 349-356, San Diego, CA, 2005.

     

    推荐文章

    [1] 机器学习-波澜壮阔40年 SIGAI 2018.4.13.

    [2] 学好机器学习需要哪些数学知识?SIGAI 2018.4.17.

    [3] 人脸识别算法演化史 SIGAI 2018.4.20.

    [4] 基于深度学习的目标检测算法综述 SIGAI 2018.4.24.

    [5] 卷积神经网络为什么能够称霸计算机视觉领域? SIGAI 2018.4.26.

    [6] 用一张图理解SVM的脉络 SIGAI 2018.4.28.

    [7] 人脸检测算法综述 SIGAI 2018.5.3.

    [8] 理解神经网络的激活函数 SIGAI 2018.5.5.

    [9] 深度卷积神经网络演化历史及结构改进脉络-40页长文全面解读 SIGAI 2018.5.8.

    [10] 理解梯度下降法 SIGAI 2018.5.11.

    [11] 循环神经网络综述—语音识别与自然语言处理的利器 SIGAI 2018.5.15

    [12] 理解凸优化 SIGAI 2018.5.18

    [13]【实验】理解SVM的核函数和参数 SIGAI 2018.5.22

    [14]【SIGAI综述】行人检测算法 SIGAI 2018.5.25

    [15] 机器学习在自动驾驶中的应用—以百度阿波罗平台为例(上) SIGAI 2018.5.29

    [16] 理解牛顿法 SIGAI 2018.5.31

    [17]【群话题精华】5月集锦—机器学习和深度学习中一些值得思考的问题 SIGAI 2018.6.1

    [18] 大话Adaboost算法 SIGAI 2018.6.2

    [ 19] FlowNet到FlowNet2.0:基于卷积神经网络的光流预测算法 SIGAI 2018.6.4

    [20] 理解主成分分析(PCA) SIGAI 2018.6.6

    [21] 人体骨骼关键点检测综述 SIGAI 2018.6.8

    [22] 理解决策树 SIGAI 2018.6.11

    [23] 用一句话总结常用的机器学习算法 SIGAI 2018.6.13

    [24] 目标检测算法之YOLO SIGAI 2018.6.15

    [25] 理解过拟合 SIGAI 2018.6.18

    [26] 理解计算:从√2到AlphaGo ——第1季 从√2谈起 SIGAI 2018.6.20

    [27] 场景文本检测—CTPN算法介绍 SIGAI 2018.6.22

    [28] 卷积神经网络的压缩和加速 SIGAI 2018.6.25

    原创声明:本文为 SIGAI 原创文章,仅供个人学习使用,未经允许,不得转载,不能用于商业目的。

    展开全文
  • 多个模式识别算法的matlab代码,,包括k近邻、二叉决策树、感知器、fisher线性判别等
  • K近邻算法原理

    千次阅读 多人点赞 2021-03-12 14:49:06
    K近邻算法原理基本思想欧氏距离算法流程影响因素 咱们来一起学习一下K近邻(k-nearest neighbors,简称KNN)算法的基本原理~ 基本思想 首先来看这样一幅图: 我们根据涂色样本点和未涂色样本点 X 的距离给涂色样本...

    咱们来一起学习一下K近邻(k-nearest neighbors,简称KNN)算法的基本原理~

    基本思想

    首先来看这样一幅图:
    K近邻
    我们根据涂色样本点和未涂色样本点 X 的距离给涂色样本点编号1-6,即:1号样本点距离X最近,其余次之。

    那么问题来了:样本点 X 应该属于哪种颜色呢?是蓝色还是绿色?

    其实,我们可以根据 X 的相邻样本点来判定。例如,和 X 距离最近的三个样本点中绿色占多数,那么 X 就属于为绿色;和 X 距离最近的 5 个样本点中蓝色占多数,那么 X 就属于蓝色。

    这种解决问题的思路正是 K 近邻算法的基本思想:根据 K 个近邻样本的 y 值来预测自身的 y 值。具体到上面例子中的 y 值就是样本点的颜色。

    K 近邻是监督学习中比较简单的一种算法,它既可

    展开全文
  • K近邻算法c/c++

    2017-10-28 09:02:54
    K近邻算法c/c++K近邻算法c/c++K近邻算法c/c++K近邻算法c/c++K近邻算法c/c++
  • K近邻算法(或简称kNN)是易于理解和实现的算法,而且是你解决问题的强大工具。 什么是kNN kNN算法的模型就是整个训练数据集。当需要对一个未知数据实例进行预测时,kNN算法会在训练数据集中搜寻k个最相似实例。对...
  • 声明  本文参考了《机器学习实战》书中代码,结合该书讲解,并加之自己的理解和阐述 问题描述  朋友海伦一直使用在线约会网站寻找适合自己的约会对象。尽管约会网站会推荐不同的人选,但她并不是喜欢每一个人。...
  • matlab的k近邻算法.rar

    2020-12-04 17:20:40
    k近邻的matlab的代码,在matalb运行a文件即可
  • k_近邻算法

    2019-02-25 08:24:51
    随着人工智能的不断发展,机器学习汇集了多种算法,k-近邻算法作为其中一种经典算法,值得学习。
  • 《机器学习实战》第二章KNN算法,书中用Python编写,数据也是源于教材的官网(均开源)。我用C++编写、实现了一下,使其中的细节更为清晰,注释较为详细。在VS2012上编译通过。请认真阅读readme说明文件。可以自己...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 33,259
精华内容 13,303
关键字:

k近邻算法