机器学习算法(二十四):最近邻算法 KNN(k-nearest neighbor)

目录

1 基于实例的学习

2 k-最近邻法

2.1 算法概述

2.2 kNN算法的一般流程

2.3 距离公式

2.4 k值的选择

2.5 KNN特点

2.5.1 特点

2.5.2 KNN算法的优势和劣势

3 距离加权最近邻算法


        k-最近邻算法基于实例的学习方法中最基本的,先介绍基于实例学习的相关概念。


1 基于实例的学习

  1. 已知一系列的训练样例,很多学习方法为目标函数建立起明确的一般化描述;但与此不同,基于实例的学习方法只是简单地把训练样例存储起来
    每当学习器遇到一个新的查询实例,它分析这个新实例与以前存储的实例的关系,并据此把一个目标函数值赋给新实例。
  2. 基于实例的方法可以为不同的待分类查询实例建立不同的目标函数逼近。事实上,很多技术只建立目标函数的局部逼近,将其应用于与新查询实例邻近的实例,而从 不建立在整个实例空间上都表现良好的逼近。当目标函数很复杂,但它可用不太复杂的局部逼近描述时,这样做有显著的优势。
  3. 基于实例方法的不足
    • 分类新实例的开销可能很大。这是因为几乎所有的计算都发生在分类时,而不是在第一次遇到训练样例时,预测的时候需要与已知的实例进行比对,运行时间会相对慢。所以,如何有效地索引训练样例,以减少查询时所需计算是一个重要的实践问题。
    • 当从存储器中检索相似的训练样例时,它们一般考虑实例的所有属性。如果目标概念仅依赖于很多属性中的几个时,那么真正最“相似”的实例之间很可能相距甚远。
    • 对存储空间的需求很大,需要占用的空间直接取决于实例数量的大小

        饥饿式学习 & 懒惰式学习

        区别点:懒惰式学习在对新实例进行预测之前不需要进行训练数据。

                      基于实例的学习就是懒惰式学习的一种。

2 k-最近邻法

2.1 算法概述

        K最近邻(K-Nearest Neighbor,KNN)算法,是著名的模式识别统计学方法,在机器学习分类算法中占有相当大的地位。它是一个理论上比较成熟的方法。既是最简单的机器学习算法之一,也是基于实例的学习方法中最基本的,又是最好的文本分类算法之一。

        kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有该类别上样本的特征。该方法在确定分类决策上,只依据最近邻的一个或者几个样本的类别来决定待分样本所属的类别。

2.2 kNN算法的一般流程

  • step.1---初始化距离为最大值
  • step.2---计算未知样本和每个训练样本的距离dist
  • step.3---得到目前K个最邻近样本中的最大距离maxdist
  • step.4---如果dist小于maxdist, 则将训练样本作为K-最近邻样本
  • step.5---重复步骤2,3,4,直到未知样本和所有训练样本的距离都算完
  • step.6---统计K-最近邻样本中每个类标号出现的次数
  • step.7---出现频率最大的类标号最为未知样本的类标号

        K近邻模型的三个基本要素:距离度量,K值的选择,分类决策规则。

        下图中有两种类型的样本数据,一类是蓝色的正方形,另一类是红色的三角形,中间那个绿色的圆形是待分类数据:

         

        如果K=3,那么离绿色点最近的有2个红色的三角形和1个蓝色的正方形,这三个点进行投票,于是绿色的待分类点就属于红色的三角形。而如果K=5,那么离绿色点最近的有2个红色的三角形和3个蓝色的正方形,这五个点进行投票,于是绿色的待分类点就属于蓝色的正方形。

2.3 距离公式

        在KNN算法中,通过计算对象间距离作为各个对象之间的非相似性指标,避免了对象之间的匹配问题,在这里距离一般使用欧式距离或者曼哈顿距离

         

2.4 k值的选择

1)如果选择较小的K 值

  • 如果选择较小的K值,就相当于用较小的领域中的训练实例进行预测,“学习”的近似误差(approximation error) 会减小,只有与输入实例较近或相似的训练实例才会对预测结果起作用,与此同时带来的问题是“学习”的估计误差会增大;
  • K值的减小就意味着整体模型变得复杂,容易发生 过拟合

2)如果选择较大的K 值

  • 如果选择较大的K值,就相当于用较大领域中的训练实例进行预测,其优点是可以 减少 学习的 估计误差 ,但缺点是学习的 近似误差会增大
  • K值的增大,就意味着整体的模型变得 简单

3)K=N

        则完全不足取,因为此时无论输入实例是什么,都只是简单的预测它属于在训练实例中最多的类,模型过于简单,忽略了训练实例中大量有用信息。

        在实际应用中,K值一般取一个比较小的数值,例如采用交叉验证法(简单来说,就是一部分样本做训练集,一部分做测试集)来选择最优的K值。(将样本数据按照一定比例,拆分出训练用的数据和验证用的数据,比如6:4拆分出部分训练数据和验证数据),从选取一个较小的K值开始,不断增加K的值,然后计算验证集合的方差,最终找到一个比较合适的K值。通过交叉验证计算方差后你大致会得到下面这样的图:

         

        当你增大k的时候,一般错误率会先降低,因为有周围更多的样本可以借鉴了,分类效果会变好。但注意,和K-means不一样,当K值更大的时候,错误率会更高。这也很好理解,比如说你一共就35个样本,当你K增大到30的时候,KNN基本上就没意义了。

        所以选择K点的时候可以选择一个较大的临界K点,当它继续增大或减小的时候,错误率都会上升,比如图中的K=10。

近似误差和估计误差的关系?

  • 近似误差:可以理解为对现有训练集的训练误差。
  • 估计误差:可以理解为对测试集的测试误差。
  1. 近似误差其实可以理解为模型估计值与实际值之间的差距。 估计误差其实可以理解为模型的估计系数与实际系数之间的差距;近似误差,更关注于“训练”。估计误差,更关注于“测试”、“泛化”。
  2. 最小化近似误差容易过拟;最小化估计误差整体的泛化能力好。

2.5 KNN特点

2.5.1 特点

        KNN是一种非参的惰性的算法模型。什么是非参,什么是惰性呢?

        非参的意思并不是说这个算法不需要参数,而是意味着这个模型不会对数据做出任何的假设,与之相对的是线性回归(我们总会假设线性回归是一条直线)。也就是说KNN建立的模型结构是根据数据来决定的,这也比较符合现实的情况,毕竟在现实中的情况往往与理论上的假设是不相符的。

        惰性又是什么意思呢?想想看,同样是分类算法,逻辑回归需要先对数据进行大量训练(tranning),最后才会得到一个算法模型。而KNN算法却不需要,它没有明确的训练数据的过程,或者说这个过程很快。

2.5.2 KNN算法的优势和劣势

KNN算法优点:

  1. 简单易用,相比其他算法,KNN算是比较简洁明了的算法。即使没有很高的数学基础也能搞清楚它的原理。
  2. 模型训练时间快,上面说到KNN算法是惰性的,重新训练代价低
  3. 预测效果好。
  4. 对异常值不敏感
  5. 适合类域交叉样本
  6. 适用大样本自动分类

KNN算法缺点:

  1. 对内存要求较高,因为该算法存储了所有训练数据
  2. 预测阶段可能很慢
  3. 对不相关的功能和数据规模敏感
  4. 计算量较大
  5. 该算法在分类时有个主要的不足是,当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。该算法只计算“最近的”邻居样本,某一类的样本数量很大,那么或者这类样本并不接近目标样本,或者这类样本很靠近目标样本。无论怎样,数量并不能影响运行结果。可以采用权值的方法(和该样本距离小的邻居权值大)来改进。 
  6. 输出的可解释性不强,例如决策树的可解释性较强。
  7. KNN算法是懒散学习方法(lazy learning,基本上不学习),一些积极学习的算法要快很多。 

至于什么时候应该选择使用KNN算法,sklearn的这张图给了我们一个答案。

3 距离加权最近邻算法

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

        例如,在上表逼近离散目标函数的算法中,我们可以根据每个近邻与xq的距离平方的倒数加权这个近邻的“选举权”。

        方法是通过用下式取代上表算法中的公式来实现:

                

        其中:

        为了处理查询点xq恰好匹配某个训练样例xi,从而导致分母为0的情况,我们令这种情况下的f '(xq)等于f(xi)。如果有多个这样的训练样例,我们使用它们中占多数的分类。

        我们也可以用类似的方式对实值目标函数进行距离加权,只要用下式替换上面的公式:

                

        其中wi的定义与之前公式中相同。

        注意这个公式中的分母是一个常量,它将不同权值的贡献归一化(例如,它保证如果对所有的训练样例xi,f(xi)=c,那么(xq)<--c)。

        注意以上k-近邻算法的所有变体都只考虑k个近邻以分类查询点。如果使用按距离加权,那么允许所有的训练样例影响xq的分类事实上没有坏处,因为非常远的实例对(xq)的影响很小。考虑所有样例的惟一不足是会使分类运行得更慢。如果分类一个新的查询实例时考虑所有的训练样例,我们称此为全局(global)法。如果仅考虑最靠近的训练样例,我们称此为局部(local)法
 

  • 3
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值