Machine Learning(2)——k-nearest neighbor算法

KNN是最简单的分类方法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。参考,

http://www.cnblogs.com/biyeymyhjob/archive/2012/07/24/2607011.html

http://blog.csdn.net/aladdina/article/details/4141127

(网上的参考基本上都跟这两个一样,这两个也基本一样)

由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方 法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。

该算法在分类时有个主要的不足是,当样本不平衡时,如一个类的样本容量很大,而其他类样本容量 很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。因此可以采用权值的方法(和该样本距离小的邻居权值大)来改进。该方法 的另一个不足之处是计算量较大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最近邻点。目前常用的解决方法是事先对已知样 本点进行剪辑,事先去除对分类作用不大的样本。该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分。

考虑算法实现,

KNN是根据已有的分类,对新输入的点进行分类。需要计算前k个最小的距离。

要保存前k个最小距离,用最大堆heap实现,

每次将新的距离与堆顶元素做比较,如果小于堆顶元素,那么将堆顶元素弹出,将新的元素放入堆。

关于画图的基本操作

http://www.opencv.org.cn/index.php/OpenCV_%E7%BC%96%E7%A8%8B%E7%AE%80%E4%BB%8B%EF%BC%88%E7%9F%A9%E9%98%B5/%E5%9B%BE%E5%83%8F/%E8%A7%86%E9%A2%91%E7%9A%84%E5%9F%BA%E6%9C%AC%E8%AF%BB%E5%86%99%E6%93%8D%E4%BD%9C%EF%BC%89#.EF.BC.882.EF.BC.89____.E7.BB.98.E5.88.B6.E5.9C.86.E5.BD.A2:

k-meansk-nearest neighbor 是最简单的机器学习算法,只要知道过程,就可以写出来了,不需要复杂的数据结构支持。

目前这两种算法都实现了,测试结果如下图,

 

图中小的实心点是随机生成的测试点,用k-means分类过后,用不同颜色将不同的cluster标出。大的圆圈是随机生成的一些测试点,用k-nearest neighbor算法将其划分到已有的cluster。从上面的图来看,结果还不错。

这只是实现了最简单的,对于复杂情况,这些算法会做一些修正,但这里没有去研究这些修正,也没有实现。

接下来,仍然是找简单的开始。

posted @ 2012-11-14 16:27  Frandy.CH  阅读(582)  评论(0编辑  收藏  举报