MLlearning(1)——kNN算法

  这篇文章讲kNN(k近邻,k-Nearest Neighbour)。这是一种lazy-learning,实现方便,很常用的分类方法。约定n为样本集中的样本数,m为样本的维度,则这个算法的训练复杂度为0,未加优化(线性扫描)的分类时间复杂度为,kd-Tree优化后复杂度可降为

思路、优点及缺陷

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

  该方法在处理多分类问题(multi-modal,对象具有多个类别标签)时,表现比SVM的要好,而且是最简单的分类方法,无需训练。

  该方法对于样本的要求较高,不能给出数量不均衡的样本,否则会出现大容量的样本填充了选取的k个样本中的多个,而这些样本距离输入对象的特征距离其实是很远的。对于这种极端情况,在没办法获得更多样本情况下,可以通过加权的WAkNN (weighted adjusted k nearest neighbor)解决。另外,这种方法的时间复杂度较高,且kd-Tree会在维数高时(一般是当m>10时)遭遇维数灾难(Curse of Dimensionality),时间复杂度退化至线性扫描(由于常数问题,实际耗时会比线性扫描更高)。

Lua实现

  为了方便起见,通常把特征空间看做一个欧式空间。两个向量之间的距离可由欧氏距离公式直接得出:

  有了这个假设,就可以直接把特征作为向量处理,进行kNN的计算。

  这里笔者用Lua简单实现了朴素的kNN算法,源码托管于github,其中还包括手写数字识别的Demo:https://github.com/Darksun2010/MLlearning/tree/master/kNN

实验——测试算法速度及正确率

  在git上clone代码后,载入其中识别数字的Demo。调用其中函数testkNN(),会测试此Demo,返回两个值:样本总数及错误率。

  笔者电脑上的结果如下(k=3):

  >print(testkNN())

  answer of kNN:  0        , correct answer:      0

  ...

  answer of kNN:  9        , correct answer:      9

  946     0.011627906976744

  错误率仅为约1.2%,相当不错的成绩!经试验,k=3对于这个样本集是最好的选择。另外,我选择用Lua语言实现它的原因有三:

  1. 我喜欢Lua
  2. Lua嵌入性强
  3. LuaJIT的执行效率比Python/CPython高好几个数量级,直逼C/C++的执行效率!

后记

  kNN只是个开始,我会写更多的文字,介绍更多的机器学习算法。

时间: 2024-10-24 20:34:17

MLlearning(1)——kNN算法的相关文章

Machine Learning In Action 第二章学习笔记: kNN算法

本文主要记录<Machine Learning In Action>中第二章的内容.书中以两个具体实例来介绍kNN(k nearest neighbors),分别是: 约会对象预测 手写数字识别 通过“约会对象”功能,基本能够了解到kNN算法的工作原理.“手写数字识别”与“约会对象预测”使用完全一样的算法代码,仅仅是数据集有变化. 约会对象预测 1 约会对象预测功能需求 主人公“张三”喜欢结交新朋友.“系统A”上面注册了很多类似于“张三”的用户,大家都想结交心朋友.“张三”最开始通过自己筛选的

KNN算法--物以类聚,人以群分

KNN(K Nearest Neighbors,K近邻 )算法是机器学习所有算法中理论最简单,最好理解的.KNN是一种基于实例的学习,通过计算新数据与训练数据特征值之间的距离,然后选取K(K>=1)个距离最近的邻居进行分类判断(投票法)或者回归.如果K=1,那么新数据被简单分配给其近邻的类.KNN算法算是监督学习还是无监督学习呢?首先来看一下监督学习和无监督学习的定义.对于监督学习,数据都有明确的label(分类针对离散分布,回归针对连续分布),根据机器学习产生的模型可以将新数据分到一个明确的类

Python KNN算法

机器学习新手,接触的是<机器学习实战>这本书,感觉书中描述简单易懂,但对于python语言不熟悉的我,也有很大的空间.今天学习的是k-近邻算法. 1. 简述机器学习 在日常生活中,人们很难直接从原始数据本身获得所需信息.而机器学习就是把生活中无序的数据转换成有用的信息.例如,对于垃圾邮件的检测,侦测一个单词是否存在并没有多大的作用,然而当某几个特定单词同时出现时,再辅以考虑邮件的长度及其他因素,人们就可以更准确地判定该邮件是否为垃圾邮件. 机器学习分为监督学习和无监督学习,其中: (1)监督学

Opencv学习之路—Opencv下基于HOG特征的KNN算法分类训练

在计算机视觉研究当中,HOG算法和LBP算法算是基础算法,但是却十分重要.后期很多图像特征提取的算法都是基于HOG和LBP,所以了解和掌握HOG,是学习计算机视觉的前提和基础. HOG算法的原理很多资料都可以查到,简单来说,就是将图像分成一个cell,通过对每个cell的像素进行梯度处理,进而根据梯度方向和梯度幅度来得到cell的图像特征.随后,将每个cell的图像特征连接起来,得到一个BLock的特征,进而得到一张图片的特征.Opencv当中自带HOG算法,可以直接调用,进行图像的特征提取.但

k-Means和KNN算法简述

k-means 算法 k-means 算法接受输入量 k :然后将n个数据对象划分为 k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高:而不同聚类中的对象相似度较小.聚类相似度是利用各聚类中对象的均值所获得一个“中心对象”(引力中心)来进行计算的. k-means 算法的工作过程说明如下:首先从n个数据对象任意选择 k 个对象作为初始聚类中心:而对于所剩下其它对象,则根据它们与这些聚类中心的相似度(距离),分别将它们分配给与其最相似的(聚类中心所代表的)聚类:然后再计算每个所获新聚类

KNN算法的感受 1

本来预计的打算是一天一个十大挖掘算法,然而由于同时要兼顾数据结构面试的事情,所以 很难办到,但至少在回家前要把数据挖掘十大算法看完,过个好年,在course上学习老吴的课程还是帮了我很大的忙,虽然浪费了时间,但是也无形中帮助我 很多,所以说还是很值得的,今天就总结KNN算法的一部分,这部分老吴的课程中没有太多涉及到,所以我又重新关注了一下,下面是我的总结,希望能对大家有 所帮组. 介绍环镜:python2.7  IDLE  Pycharm5.0.3 操作系统:windows 第一步:因为没有nu

KNN算法与Kd树

最近邻法和k-近邻法 下面图片中只有三种豆,有三个豆是未知的种类,如何判定他们的种类? 提供一种思路,即:未知的豆离哪种豆最近就认为未知豆和该豆是同一种类.由此,我们引出最近邻算法的定义:为了判定未知样本的类别,以全部训练样本作为代表点,计算未知样本与所有训练样本的距离,并以最近邻者的类别作为决策未知样本类别的唯一依据.但是,最近邻算法明显是存在缺陷的,比如下面的例子:有一个未知形状(图中绿色的圆点),如何判断它是什么形状? 显然,最近邻算法的缺陷--对噪声数据过于敏感,为了解决这个问题,我们可

KNN算法的理解

一.算法 1.kNN算法又称为k近邻分类(k-nearest neighbor classification)算法. 最简单平庸的分类器或许是那种死记硬背式的分类器,记住全部的训练数据.对于新的数据则直接和训练数据匹配,假设存在同样属性的训练数据,则直接用它的分类来作为新数据的分类.这样的方式有一个明显的缺点,那就是非常可能无法找到全然匹配的训练记录. kNN算法则是从训练集中找到和新数据最接近的k条记录.然后依据他们的主要分类来决定新数据的类别.该算法涉及3个主要因素:训练集.距离或相似的衡量

KNN算法理解

一.算法概述 1.kNN算法又称为k近邻分类(k-nearest neighbor classification)算法. 最简单平庸的分类器或许是那种死记硬背式的分类器,记住全部的训练数据,对于新的数据则直接和训练数据匹配,假设存在同样属性的训练数据,则直接用它的分类来作为新数据的分类.这样的方式有一个明显的缺点,那就是非常可能无法找到全然匹配的训练记录. kNN算法则是从训练集中找到和新数据最接近的k条记录,然后依据他们的主要分类来决定新数据的类别.该算法涉及3个主要因素:训练集.距离或相似的