这篇文章讲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只是个开始,我会写更多的文字,介绍更多的机器学习算法。

UPD

  为了统一,github上的实现已替换为C++实现。

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

  1. 【Machine Learning】KNN算法虹膜图片识别

    K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  2. KNN算法

    1.算法讲解 KNN算法是一个最基本.最简单的有监督算法,基本思路就是给定一个样本,先通过距离计算,得到这个样本最近的topK个样本,然后根据这topK个样本的标签,投票决定给定样本的标签: 训练过程 ...

  3. kNN算法python实现和简单数字识别

    kNN算法 算法优缺点: 优点:精度高.对异常值不敏感.无输入数据假定 缺点:时间复杂度和空间复杂度都很高 适用数据范围:数值型和标称型 算法的思路: KNN算法(全称K最近邻算法),算法的思想很简单 ...

  4. 什么是 kNN 算法?

    学习 machine learning 的最低要求是什么?  我发觉要求可以很低,甚至初中程度已经可以.  首先要学习一点 Python 编程,譬如这两本小孩子用的书:[1][2]便可.   数学方面 ...

  5. 数据挖掘之KNN算法(C#实现)

    在十大经典数据挖掘算法中,KNN算法算得上是最为简单的一种.该算法是一种惰性学习法(lazy learner),与决策树.朴素贝叶斯这些急切学习法(eager learner)有所区别.惰性学习法仅仅 ...

  6. 机器学习笔记--KNN算法2-实战部分

    本文申明:本系列的所有实验数据都是来自[美]Peter Harrington 写的<Machine Learning in Action>这本书,侵删. 一案例导入:玛利亚小姐最近寂寞了, ...

  7. 机器学习笔记--KNN算法1

    前言 Hello ,everyone. 我是小花.大四毕业,留在学校有点事情,就在这里和大家吹吹我们的狐朋狗友算法---KNN算法,为什么叫狐朋狗友算法呢,在这里我先卖个关子,且听我慢慢道来. 一 K ...

  8. 学习OpenCV——KNN算法

    转自:http://blog.csdn.net/lyflower/article/details/1728642 文本分类中KNN算法,该方法的思路非常简单直观:如果一个样本在特征空间中的k个最相似( ...

  9. KNN算法与Kd树

    最近邻法和k-近邻法 下面图片中只有三种豆,有三个豆是未知的种类,如何判定他们的种类? 提供一种思路,即:未知的豆离哪种豆最近就认为未知豆和该豆是同一种类.由此,我们引出最近邻算法的定义:为了判定未知 ...

随机推荐

  1. Sysprep命令详解

    本主题描述了 Windows(R) 8 版本的系统准备 (Sysprep) 工具的命令行语法. 如果你打算创建安装映像以部署到不同的计算机上,则必须运行带有 /generalize 选项的 Syspr ...

  2. Codeforces Round #328 (Div. 2) B. The Monster and the Squirrel 打表数学

    B. The Monster and the Squirrel Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/c ...

  3. POJ 2195 D - Going Home 费用流

    D - Going HomeTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/vie ...

  4. 【Objective-C】04-第一个OC程序解析

    说明:这个Objective-C专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序猿,可以高速上手Objective-C.假设你还没有编程经验,或者对Objective-C.iOS开发 ...

  5. Cache选型的一些思考

    Cache对于减轻DB负载有非常关键的数据.以下对经常使用的memcached和redis做个总结,便于技术选型. 1 memcached  (1) 支持的操作有限,支持经常使用的set,get,de ...

  6. Java 装饰模式 (Decorator)

    装饰模式 动态的将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的取代方案 代码 package gx.component; /** * 组件:装饰类和被装饰类 都要继承:为了类型保持一致 ...

  7. Android通过http协议POST传输方式

    Android通过http协议POST传输方式如下: 方式一:HttpPost(import org.apache.http.client.methods.HttpPost) 代码如下: privat ...

  8. iOS开发——动画篇Swift篇&常用动画总结

    UIView动画: UIView动画时最基本的动画,是直接对我们界面上控件进行简单的动画效果实现,如果你只需要用到一些简单的效果,那么这个很适合你,关于UIView动画实现恨简单, UIKit直接将动 ...

  9. Zend Studio / Ecliplse插件StartExplorer

    Install site.zip (quick and simple way) Locate zip file under site\target in Project Explorer, Start ...

  10. Lua调用自定义C++类

    弄了一天终于会Lua调用自定义C++类.不容易啊. 我的电脑是64位的,装了64的Python不行,装了32位的就可以了,靠!下面是报错信息 python pyyaml Cheetah全都是装32位的 ...