机器学习(四)最邻近规则分类

来源:互联网 发布:中金智德 知乎 编辑:程序博客网 时间:2024/06/05 23:50

       最邻近规则分类英文名字是:K-Nearest Neighbor,简称为KNN。它是机器学习中比较简单的算法,它是Cover和Hart在1968年提出来的最初原型为临近算法,它最早用于分类,故它属于分类算法中的一种;输入是有基于实例的学习(Instance-based Learning)即它的学习是从输入的一些带有label标签的实例中得来的,它也称为懒惰学习(Lazy Learning)(因为开始时它并不需要建立任何的模型,在实例进行测试归类时才进行分类)。

       最邻近规则分类定义:就像它名字所说的一样,在一些样本中根据特征值的相似性把其中特征向量相邻最近的一些样本实例划分为一类,然后再来了一个新样本时根据特征值再和K个聚类的特征值进行比较,在这K个聚类的特征值中属于哪一类的多就属于哪一类。即“近朱者赤近墨者黑”的道理,由你的相似实例的特征向量推断出你的分类。核心思想是:如果一个样本实例在特征空间中的K个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。

       举一个例子:在我们看电影时,判别电影是动作片还是浪漫爱情片,其中有一些实例样本,在这些实例样本中统计了两个特征向量:1接吻次数;2:打斗次数。见如下图所示:


        其中我们看到在前3个电影中打斗次数为3次、2次、1次;接吻次数为:104次、100次、81次;它被分为浪漫爱情片;在后3个电影中打斗次数为101次、99次、98次;接吻次数为10次、5次、2次;它被分为动作片;故来了第7个样本它的打斗次数为18次,接吻次数为90次,判断它是哪一种类型的电影;我们可以把机器学习中的最邻近规则分类算法应用于这个实例中,其中更为抽象的见下图:


        其中把7部电影分为7个样本,抽象简化为7个二维空间中的点:6个训练样本抽象简化为6个二维坐标上的点,1个测试样本抽象简化为1个二维坐标上的点;其中6个训练样本已经分类完毕,画在二维坐标平面上,x轴代表接吻次数,y轴代表打斗次数,其中A、B、C三点代表浪漫爱情片,D、E、F三点代表动作片;G点X轴接吻为90,Y轴打斗为18,然后在二维坐标平面上看G点离A、B、C三点浪漫爱情片近还是离动作片近,即可分出G点为哪一类电影。

       这个例子中我们以欧几里得距离来判断距离远近,选择参数K为5;进行判断G点属于哪一类:

      其中欧几里得距离定义为:


        故用Python实现为:

[python] view plain copy
  1. # coding:utf-8  
  2. import math as m  
  3.   
  4. def computeDistanceEuclidean(x1, y1, x2, y2):  
  5.     distance = m.sqrt(m.pow(x1-x2, 2)+m.pow(y1-y2, 2))  
  6.     return distance  
  7. dis_a_g = computeDistanceEuclidean(31041890)  
  8. dis_b_g = computeDistanceEuclidean(21001890)  
  9. dis_c_g = computeDistanceEuclidean(1811890)  
  10. dis_d_g = computeDistanceEuclidean(101101890)  
  11. dis_e_g = computeDistanceEuclidean(9951890)  
  12. dis_f_g = computeDistanceEuclidean(9821890)  
  13.   
  14. print("distances a-g:"+str(dis_a_g))  
  15. print("distances b-g:"+str(dis_b_g))  
  16. print("distances c-g:"+str(dis_c_g))  
  17. print("distances d-g:"+str(dis_d_g))  
  18. print("distances e-g:"+str(dis_e_g))  
  19. print("distances f-g:"+str(dis_f_g))  
  20. #输出为:  
  21. #distances a-g:20.5182845287  
  22. #distances b-g:18.8679622641  
  23. #distances c-g:19.2353840617  
  24. #distances d-g:115.277925033  
  25. #distances e-g:117.413798167  
  26. #distances f-g:118.928549979  
        故上面选择K为5是距离最近的点为A、B、C、D、E,故这个电影应该是浪漫爱情片。上面可知其实这个K值选择3会更好。

       再看下面这个例子:


        再看上面的豆子分为了3类:黑豆属于一类,绿豆属于一类,红豆属于一类;然后在上面的3类豆子当中出现了3个未知的豆子,其中未知的紫色的豆子距离它最近的K个邻居样本实例是黑色的豆子,故紫色未知豆子为黑豆,相似的原理,绿色未知豆子是绿豆,红色未知豆子是红豆。

       上面说了两个例子下面来总结一下KNN算法的步骤

       1:为了判别新到来的未知实例,以所有已知类别的实例作为参照;

       2:选择参数K;

       3:计算未知实例与所有已知实例的距离;

       4:选择最近K个已知实例;

       5:根据少数服从多数的投票法则,让未知实例归类为K个最邻近样本中最多数的类别。

      官方严格版的说法

      1:准备数据,对数据进行预处理;

      2:选用合适的数据结构存储训练数据和测试元组;

      3:设定参数K;

      4:维护一个大小为K的按距离由大到小的优先级队列,用于存储最近邻训练元组。随机从训练元组中选取K个元组作为初始的最近元组,分别计算测试元组到这K个元组的距离,将训练元组标号和距离存入优先级队列;

      5:遍历训练元组集,计算当前训练元组与测试元组的距离,将所得距离L与优先级队列中最大距离Lmax进行比较;

      6:若L>=Lmax,则舍弃该元组,遍历下一个元组。若L < Lmax,删除优先级队列中最大距离的元组,将当前训练元组存入优先级队列。

      7. 遍历完毕,计算优先级队列中k个元组的多数类,并将其作为测试元组的类别。

      8. 测试元组集测试完毕后计算误差率,继续设定不同的k值重新进行训练,最后取误差率最小的k值。

      注意点:

      1:K值得选择,K一般不能选取的太大,这样会降低程序运行的效率与结果的准确率;当然了K值也不能选取太小,要根据测试而来,一般选择奇数值,因为后面我们我们划分实例类别时用到的是少数服从多数的原则,故K一般为1、3、5、7、9、11之类的奇数,当然了K的选择也需要测试,使其结果正确率较好的K为基准。k一般低于训练样本数的平方根。

     2:距离L的测量选择,距离的测量方式有很多,比如:最著名的欧几里得距离(Euclidean Distance)、曼哈顿距离、相关度、余弦值等等来计算距离的。比如上面的电影分类就用的是欧几里得距离计算的。

     最近邻算法的优点:

     1:简单、易于理解、易于实现、无需估计参数、无需训练;

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

     3:通过对K的选择可具备丢噪音数据的健壮性;

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

     最近邻算法的缺点:


     1:该算法在分类时有个主要的不足是,当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。 该算法只计算“最近的”邻居样本,某一类的样本数量很大,那么或者这类样本并不接近目标样本,或者这类样本很靠近目标样本。无论怎样,数量并不能影响运行结果。

     2:该方法的另一个不足之处是计算量较大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最近邻点。

     3:可理解性差,无法给出像决策树那样的规则。

     4:需要大量空间存储已知的实例。

     5:算法复杂度高(需要比较所有已知实例与要分类的实例)

     改进策略:

     1:从分类效率方面:事先对样本属性进行约简,删除对分类结果影响较小的属性,快速的得出待分类样本的类别。该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分。

     2:分类效果:采用权值的方法(和该样本距离小的邻居权值大(ps比如1/d))来改进,Han等人于2002年尝试利用贪心法,针对文件分类实做可调整权重的k最近邻居法WAkNN (weighted adjusted k nearest neighbor),以促进分类效果;而Li等人于2004年提出由于不同分类的文件本身有数量上有差异,因此也应该依照训练集合中各种分类的文件数量,选取不同数目的最近邻居,来参与分类。

阅读全文
0 0