K近邻法

K近邻法:假定存在已标记的训练数据集,分类时对新的实例根据其K个最近邻的训练实例的类别,通过多数表决等分类决策规则进行预测。

k近邻不具有显示学习的过程,是“懒惰学习”(lazy learning)。分类器不需要使用训练集进行训练。实际上是利用训练数据集对特征向量空间进行划分,并作为其分类的“模型”。

(标注:Lazy learning懒惰学习:训练阶段仅仅把样本保存起来,无训练时间开销,收到测试样本再进行处理;

Eager laarning急切学习:训练阶段就对样本学习处理的方法。)

1  K近邻分类法的三个基本要素

K近邻分类法的三个基本要素为:k值的选择、距离度量、分类决策规则。当三个要素确定后,对于任何一个新的输入实例,它所属的类唯一的确定。

1.1 k值的选择

K值的选择会对k近邻法的结果产生较大的影响。

当k较小时:

优点:学习的近似误差会减小。

缺点:预测结果会对近邻的实例点非常敏感,k值的减小就意味着整体模型变得复杂,容易发生过拟合。

当k较大时:

优点:减小学习的估计误差。

缺点:学习的近似误差会增大,k值的增大意味着整体的模型变得简单,过于简单会完全忽略训练实例中的大量有用信息。

K值一般取一个较小的值,通常采用交叉验证法来选取最优的k值。

1.2 距离度量

特征空间中的两个实例点的距离是两个实例点相似程度的反映。不同的距离度量方式所确定的最近邻点是不同的。K近邻的一般使用的是欧式距离,但也可以是其他距离。

Lp距离:

       (p>=1)

P=2  欧式距离

P=1  曼哈顿距离

P= 各个坐标距离的最大值

1.3 分类决策规则

K近邻中的分类决策规则一般是多数表决,即由输入实例的k个最近邻中的多数类决定输入实例的类。

多数表决规则等价于经验风险最小化。

2  K近邻的一个实现方法:kd树

   问题:如何对训练数据进行快速k近邻搜索

最简单的实现方法:线性扫描。缺点:当训练集很大时,计算非常耗时。所以需要特殊的存储结构存储训练数据:kd树,以减少计算距离的次数。

因为实际数据一般都会呈现簇状的聚类形态,因此我们想到建立数据索引,然后再进行快速匹配。索引树是一种树结构索引方法,其基本思想是对搜索空间进行层次划分。若划分空间没有重叠,其代表就是k-d树。

k-d树(k-dimensional tree),是一种分割k维数据空间的数据结构。本质上是二叉树,表示对k维空间的一个划分,构成一系列的k维超矩形区域。

方法:依次选择坐标轴对空间切分,选在一个坐标轴并在此坐标轴上选定一个切分点,根据选定的切分点垂直于选定的切分点将当前矩形区域切分(若选择中位数为切分点,这样得到的kd树是平衡的),直到每一个子区域内没有实例点为止。

例:6个二维数据点{(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)},数据点位于二维空间内(如图1中黑点所示)。k-d树算法就是要确定图1中这些分割空间的分割线(多维空间即为分割平面,一般为超平面)。

分析:首先选择x轴,6个点的x坐标的中位数为7,以x=7划分为左右两个子矩形。选择y轴,左矩形以y=4划分,右矩形以y=6划分,如此递归,直到划分如图1所示并生成如图2所示的k-d树。

搜索以最近邻为例:

查找点为(2,4.5)。从(7,2)开始,横坐标2小于7进入左子树(5,4),4.5大于4进入右子树(4,7),形成搜索路径<(7,2),(5,4),(4,7)>,取(4,7)为当前最近邻点,计算其与目标查找点的距离为3.202。然后回溯到(5,4),计算其与查找点之间的距离为3.041。以(2,4.5)为圆心,以3.041为半径作圆,可见该圆和y = 4超平面交割,所以需要进入(5,4)左子空间进行查找。此时需将(2,3)节点加入搜索路径中得<(7,2),(2,3)>。回溯至(2,3)叶子节点,(2,3)距离(2,4.5)比(5,4)要近,所以最近邻点更新为(2,3),最近距离更新为1.5。回溯至(7,2),以(2,4.5)为圆心1.5为半径作圆,并不和x = 7分割超平面交割。至此,搜索路径回溯完。返回最近邻点(2,3),最近距离1.5。

Kd树搜索的平均时间复杂度是O(logN),kd树更适合于训练实例数远大于空间维数,当其接近时效率下降,几乎接近于线性扫描。

3  k近邻法用于回归

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

参考

百度百科:k近邻算法

http://baike.baidu.com/link?url=niNGb6_6PCMqgofzhI8Ku1MtGOjJY2tkK3D6eUq8f2Ws-G0VWAWeexRt-m42TjmvJptskDtBE2BYKLqE-yHlHK

百度百科:Kd树:

http://baike.baidu.com/link?url=B2eikDcSHrYQw2pHkEI0A0kVrNywu7pfCTPwlYvCADvW5cupT7-rIyUNu_LPOApA-PClHiSOefnjbYUA6JomH_

李航  《统计学习方法》

博客:http://blog.csdn.net/likika2012/article/details/39619687

K近邻分类法的更多相关文章

  1. OpenCV手写数字字符识别(基于k近邻算法)

    摘要 本程序主要参照论文,<基于OpenCV的脱机手写字符识别技术>实现了,对于手写阿拉伯数字的识别工作.识别工作分为三大步骤:预处理,特征提取,分类识别.预处理过程主要找到图像的ROI部 ...

  2. K近邻法(KNN)原理小结

    K近邻法(k-nearst neighbors,KNN)是一种很基本的机器学习方法了,在我们平常的生活中也会不自主的应用.比如,我们判断一个人的人品,只需要观察他来往最密切的几个人的人品好坏就可以得出 ...

  3. k近邻算法(knn)的c语言实现

    最近在看knn算法,顺便敲敲代码. knn属于数据挖掘的分类算法.基本思想是在距离空间里,如果一个样本的最接近的k个邻居里,绝大多数属于某个类别,则该样本也属于这个类别.俗话叫,"随大流&q ...

  4. 机器学习实战笔记--k近邻算法

    #encoding:utf-8 from numpy import * import operator import matplotlib import matplotlib.pyplot as pl ...

  5. k近邻(KNN)复习总结

    摘要: 1.算法概述 2.算法推导 3.算法特性及优缺点 4.注意事项 5.实现和具体例子 6.适用场合内容: 1.算法概述 K近邻算法是一种基本分类和回归方法:分类时,根据其K个最近邻的训练实例的类 ...

  6. scikit-learn K近邻法类库使用小结

    在K近邻法(KNN)原理小结这篇文章,我们讨论了KNN的原理和优缺点,这里我们就从实践出发,对scikit-learn 中KNN相关的类库使用做一个小结.主要关注于类库调参时的一个经验总结. 1. s ...

  7. 学习笔记——k近邻法

    对新的输入实例,在训练数据集中找到与该实例最邻近的\(k\)个实例,这\(k\)个实例的多数属于某个类,就把该输入实例分给这个类. \(k\) 近邻法(\(k\)-nearest neighbor, ...

  8. k近邻

    k近邻(k-NearestNeighbor)算法简称kNN.基本思想简单直接,对于一个需要分类的数据实例x,计算x与所有已知类别的样本点在特征空间中的距离.取与x距离最近的k个样本点,统计这些样本点所 ...

  9. 机器学习PR:k近邻法分类

    k近邻法是一种基本分类与回归方法.本章只讨论k近邻分类,回归方法将在随后专题中进行. 它可以进行多类分类,分类时根据在样本集合中其k个最近邻点的类别,通过多数表决等方式进行预测,因此不具有显式的学习过 ...

随机推荐

  1. 【A Global Line Matching Algorithm for 2D Laser Scan Matching in Regular Environment】

    只看了前面的部分,灭有看实验,觉得整体风格比较傻白甜,与我的想法不谋而合.简单明了,用起来应该比较方便. 初步探测:如果有直线,就给线性插值一下. 分级聚类:利用简单的阈值给聚类了一下,分成了段段. ...

  2. TAP/TUN(二)

    tap.c代码      #include<assert.h> #include<fcntl.h> #include<stdio.h> #include<st ...

  3. jquery.nicescroll完美滚动条使用方法

    配置参数 当调用"niceScroll"你可以传递一些参数来定制视觉方面: cursorcolor - 十六进制改变光标颜色,默认值是"#000000" cur ...

  4. linux学习网站分享

    http://www.zhihu.com/question/19895288 http://linux.vbird.org/ 两个linux学习的网页存起来,以后学习.

  5. Apache Commons Collections

    http://commons.apache.org/proper/commons-collections/userguide.html 1. Utilities SetUtils Collection ...

  6. iOS —— 字典遍历排序

    字典NSDictionary一般的遍历方法都是: NSArray* arr = [yourdictonary allKeys]; for(NSString* str in arr) { NSLog(& ...

  7. SPSS数据分析—Probit回归模型

    Probit含义为概率单位,和Logistic回归一样,Probit回归也用于因变量为分类变量的情况,通常情况下,两种回归方法的结果非常接近,但是由于Probit回归的结果解释起来比较抽象不易理解,因 ...

  8. 输入scanner,if-else

    import java.util.Scanner; public class Job{ public static void main(String[] args){ Scanner scanner ...

  9. js文件如何最后加载

    总结一下,大概有三种方式 1.最简单粗暴的:将js文件放在最后写 2.window.onload当一个文档完全下载到浏览器中时,才会触发window.onload事件.这意味着页面上的全部元素对js而 ...

  10. (47) odoo详细操作手册

    odoo 8 详细操作手册, ERP(Odoo8.0)操作手册-v1.10(陈伟明).pdf 链接: http://pan.baidu.com/s/1hsp0bVQ 密码: r9tt 花了将近9个月时 ...