KNN(K最近邻算法)

1、KNN行业应用:

比如文字识别,面部识别;预测某人是否喜欢推荐电影(Netflix);基因模式识别,比如用于检测某中年疾病;客户流失预测、欺诈侦测(更适合于稀有事件的分类问题)

KNN应用场景:通常最近邻分类器使用于特征与目标类之间的关系为比较复杂的数字类型,或者说二者关系难以理解,但是相似类间特征总是相似

KNN算法:

简单有效,对数据分布没有假设,数据训练也很快

但是它没有模型输出,因此限制了对特性间关系的理解

分类阶段也比较慢,耗费内存

对nominal特征以及缺少数据需要预先处理

2、原理

1)该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。KNN方法虽然从原理上也依赖于极限定理,但在类别决策时,只与极少量的相邻样本有关。由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。

KNN算法不仅可以用于分类,还可以用于回归。通过找出一个样本的k个最近邻居,将这些邻居的属性的平均值赋给该样本,就可以得到该样本的属性。更有用的方法是将不同距离的邻居对该样本产生的影响给予不同的权值(weight),如权值与距离成正比。

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

 

2)KNN的距离选择:

用欧几里德还是余弦距离:根据欧式距离和余弦相似度各自的计算方式和衡量特征,分别适用于不同的数据分析模型:

1.  欧式距离能够体现个体数值特征的绝对差异,所以更多的用于需要从维度的数值大小中体现差异的分析,如使用用户行为指标分析用户价值的相似度与差异

2.  余弦相似度更多的是从方向上区分差异,而绝对的数值不敏感,更多的用于使用用户对内容评分来区分用户兴趣的相似度和差异,同时修正了用户间可能存在的度量标准不统一的问题(因为余弦相似度对绝对值不敏感)

 

3)选择合适的距离衡量:

高纬度对距离衡量的影响:众所周知当变量数越多,欧式距离的区分能力就越差。

变量值域对距离的影响:值域越大的变量常常会在距离计算中占据主导作用,因此应先对变量进行标准化。对于数字类型变量采用最小最大值标准化方法Xnew=(X-min(X))/(max(X)-min(X));对于分类变量采用哑元变量来处理。

 

4)总结

KNN思路:最简单平凡的分类器就是死记硬背式的分类器,记住所有的训练数据,对于新的数据则直接和训练数据匹配,如果存在相近属性的训练数据,则直接用它的分类作为新数据的分类。这种方法有一个明显的缺点,那就是很可能一个新数据与训练数据属性值差异很大时,无法找到完全匹配的训练记录。

KNN算法则是从训练集中找到和新数据最接近的K条记录,然后根据他们的主要分类来决定新数据的类别。该算法涉及3个主要因素:训练集、距离或相似的衡量、K的大小。

2、KNN的优点和缺点

KNN的优缺点

(1)、优点

①简单,易于理解,易于实现,无需参数估计,无需训练;

对异常值不敏感(个别噪音数据对结果的影响不是很大);

③适合对稀有事件进行分类;

④适合于多分类问题(multi-modal,对象具有多个类别标签),KNN要比SVM表现要好.

(2)、缺点

1)对测试样本分类时的计算量大,内存开销大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最近邻点。目前常用的解决方法是事先对已知样本点进行剪辑,事先去除对分类作用不大的样本;

1)可解释性差,无法告诉你哪个变量更重要,无法给出决策树那样的规则;

3)K值的选择:最大的缺点是当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。该算法只计算“最近的”邻居样本,某一类的样本数量很大,那么或者这类样本并不接近目标样本,或者这类样本很靠近目标样本。无论怎样,数量并不能影响运行结果。可以采用权值的方法(和该样本距离小的邻居权值大)来改进;

4)消极学习方法、懒惰算法

(3)、KNN性能问题:

KNN是一种懒惰算法;懒惰的后果是构造模型很简单,但在对测试样本分类的系统开销大,因为要扫描全部训练样本并计算距离;可以使用压缩训练样本量提高计算的效率。

3、KNN的K值的选择

K值的选择:对K近邻算法的结果会产生重大影响。

K值较小:就相当于用较小的领域中的训练实例进行预测,“学习”近似误差会减小, K值的减小就意味着整体模型变得复杂,容易发生过拟合;

K值较大:就相当于用较大领域中的训练实例进行预测,其优点是可以减少学习的估计误差,但缺点是学习的近似误差会增大。这时候,与输入实例较远(不相似的)训练实例也会对预测器作用,使预测发生错误,且K值的增大就意味着整体的模型变得简单k很大,那么可以减少干扰数据的影响,但是此时就导致了系统性偏差(K值太小会造成过度拟合),比如如果取k为总的训练数据数,那么每次投票肯定都是训练数据中多的类别胜利。显然训练数据的系统性偏差会影响结果。

在实际应用中,K值一般取一个比较小的数值,例如采用交叉验证法(简单来说,就是一部分样本做训练集,一部分做测试集)来选择最优的K值。

通常情况下,选择不同的k 会使得我们的算法的表现有好有坏,我们需要对 k 经过多种尝试,来决定到底使用多大的 k 来作为最终参数。k通常会在3~10直接取值,或者是k等于训练数据的平方根。比如15个数据,可能会取k=4。在实际中,我们应该通过交叉验证的办法来确定k值。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐