K近邻(KNN)算法

K近邻(KNN)算法

一、算法简述


k近邻(k-Nearest Neighbor,k-NN)算法,最简单的机器学习算法之一,是基于实例的学习方法中一种最基本的、有监督学习的分类方法,同时,KNN算法也可用于回归(KNN做回归时,一般是选择平均法,即最近的K个样本的样本输出的平均值作为回归预测值)。
KNN的基本原理:对于样本空间的中的每一个样本(特征向量V,分类C),我们可以建立其映射关系,即 F(V)=C(这里的F表示一种映射关系,并不是实际的函数表达式),样本中一个特定的样本(v,c),必定满足F(v)=c,对于我们有一个待分类样本(v1,?),如果有|v1-v|→0,则可以认为F(v1)→c,这样的分类可以理解为只找一个最近邻点的1NN方法。KNN方法,则是在样本空间中选择与待测样本距离最近(最相似)的K个点,选取K个点中出现次数最多的分类作为待测样本的分类。
先举一个简单但是很有特点的例子,如下图所示
KNN实例
我们的样本空间中有11个样本(6蓝和5红),对于不确定的分类(绿色),我们找到离其最近的k个点,通过出现次数更多的颜色来确定绿色待测样本的分类。这就有一个很有意思的现象,图中,分别选择了2个k值(k=3和k=5)k=3时,分类中红色有2个,蓝色只有1个,因此会将绿色划分到成红色类。而k=5时,蓝色则多于红色,会将绿色分到蓝色类。
从这个小例子中,可以得出k近邻算法的三个基本要素:度量方式、k值的选择、分类决策规则。

二、三个基本要素


1. 度量方式

     样本空间(特征空间)中两个对象的距离是它们相似程度的量化反映。k近邻模型的特征空间可被抽象为n维的向量空间R,现在两个对象之间的距离就可转化为两个向量之间的距离,这样研究起来就方便多了。在k近邻模型中,计算向量之间距离的公式列举如下:

(1) 欧式距离:
(2)曼哈顿距离:
(3)切比雪夫距离:

(4)闵可夫斯基距离:
特点:为综合性的公式 。
(5)马氏距离:
特点:可排除对象间的相关性。
(6)相关距离:
(7)夹角余弦距离和Tonimoto系数:
(I)夹角余弦距离:
(II)Tonimoto系数(夹角余弦的改进):
值得注意的是,在实际情况中,x,y的取值情况可能差别很大,这使得数字差值最大的属性对计算结果的影响很大,因此,有时候需要对样本的特征数据,进行归一化。同时,有时还需要考虑不同样本特征的权值

2. k值的选择

从上面的实例中,可以看出K的取值对学习其结果的预测起到了很大的影响

  • 如果选择较小的K值,就相当于用较小的领域中的训练实例进行预测,“学习”近似误差会减小,只有与输入实例较近或相似的训练实例才会对预测结果起作用,与此同时带来的问题是“学习”的估计误差会增大,换句话说,K值的减小就意味着整体模型变得复杂,容易发生过拟合;
  • 如果选择较大的K值,就相当于用较大领域中的训练实例进行预测,其优点是可以减少学习的估计误差,但缺点是学习的近似误差会增大。这时候,与输入实例较远(不相似的)训练实例也会对预测器作用,使预测发生错误,且K值的增大就意味着整体的模型变得简单。
  • 在实际应用中,K值一般取一个比较小的数值,例如采用交叉验证法(简单来说,就是一部分样本做训练集,一部分做测试集)来选择最优的K值。

统计学习方法中参数选择一般是要在偏差(Bias)与方差(Variance)之间取得一个平衡(Tradeoff)。

偏差:模型输出值与真实值之间的差异。偏差越高,则数据越容易欠拟合(Underfitting),未能充分利用数据中的有效信息。
方差:对数据微小改变的敏感程度。假如有一组同一类的样本,并且这些样本的特征之间只有微小差异,用训练好的模型进行预测并求得方差。理想情况下,我们应该得到的方差为0,因为我们预料我们的模型能很好处理这些微小的变化;但现实中存在很多噪声(即存在不同类别的样本,其特征向量差异很小),即使是特征差异很小的同一类样本也可能达到不同类别的结果。而方差实际上就是衡量对噪声的敏感程度。方差越高,越容易过拟合(Overfiiting),对噪声越敏感。
同样,对knn而言,k值的选择也要在偏差与方差之间取得平衡。若k取很小,例如k=1,则分类结果容易因为噪声点的干扰而出现错误,此时方差较大;若k取很大,例如k=N(N为训练集的样本数),则对所有测试样本而言,结果都一样,是分类的结果都是样本最多的类别,这样稳定是稳定了,但预测结果与真实值相差太远,是偏差过大。这样k即不能取太大也不能取太小,怎么办?通常的做法是,利用交叉验证评估一系列不同的k值,选取结果最好的k值作为训练参数。

3. 分类决策规则

(1)多数表决
k近邻法中的分类决策规则往往是多数表决,即由输入对象的k个邻近中的多数类决定输入对象的类,通俗点就是“少数服从多数”。
(2)误分类率
误分类率即对输入对象出现错误分类的概率。其数学表示如下:
对给定的实例 , 其最近邻的k个训练实例点构成集合 .如果涵盖 的区域的类别是 ,那么误分类率是

要使误分类率最小即经验风险最小,就要使最大,所以多数表决规则等价于经验风险最小化.

三、KNN算法的实现

在实现k近邻法时,主要考虑的问题是如何对训练数据进行快速k近邻捜索。
k近邻法最简单的实现方法是线性扫描法(linear scan俗称暴力破解法)。由于KNN算法一种中lazy-learning算法,它无需在训练集上进行训练,只是在测试集上计算测试集的每一个对象与每一个训练对象之间的距离,时间复杂度O(MN),当训练集很大时,计算非常耗时,这种方法是不可行的.
为了提高k近邻搜索的效率,我们可以构建数据的索引(因为实际数据一般都会呈现簇状的聚类形态,因此我们想到建立数据索引,然后再进行快速匹配)。索引树是一种树结构索引方法,其基本思想是对搜索空间进行层次划分。根据划分的空间是否有混叠可以分为Clipping和Overlapping两种。前者划分空间没有重叠,其代表就是kd树;后者划分空间相互有交叠,其代表为R树

四、KNN算法小结

转载自http://www.cnblogs.com/pinard/p/6061661.html
    KNN的主要优点有:
    1) 理论成熟,思想简单,既可以用来做分类也可以用来做回归
    2) 可用于非线性分类
    3) 训练时间复杂度比支持向量机之类的算法低,仅为O(n)
    4) 和朴素贝叶斯之类的算法比,对数据没有假设,准确度高,对异常点不敏感
    5) 由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合
    6)该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分    
    KNN的主要缺点有:
    1)计算量大,尤其是特征数非常多的时候
    2)样本不平衡的时候,对稀有类别的预测准确率低
    3)KD树,球树之类的模型建立需要大量的内存
    4)使用懒散学习方法,基本上不学习,导致预测时速度比起逻辑回归之类的算法慢
    5)相比决策树模型,KNN模型可解释性不强
    

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值