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. VS后台程序无法调用App_Code里的公共类解决方案

    在Web应用程序中不能通过右键项目-〉”添加“-〉”添加ASP.NET文件夹“方式添加 .因为Web应用程序中App_Code就不存在 .不过可以通过手动的方式创建,添加一个文件夹命名为App_Cod ...

  2. 表单提交与后台PHP如何接口?

    在网页中,常常有这样那样的表单需要提交,比如登陆,比如注册,比如查询,比如填写问卷.在这样的表单提交过程中,我们究竟向后台提交了什么,是以什么形式提交的,是一个很值得探讨的问题. 提交了什么——就是我 ...

  3. 移动web点5像素的秘密

    最近和一个朋友聊天,朋友吐露了工作上的一些不开心,说自己总是喜欢跟别人比较,活得比较累,这种感觉大部分人经历过,往往觉得是自己心态不好,其实不然,这是人性,此时应该快速摆脱这种状态,想到DOTA大9神 ...

  4. (44) odoo中的WebService

    * 前言   erp系统会和其它系统进行对接,这时就要接口,官方给出的是两解决方案   * XML-RPCLibrary  举例    import xmlrpclib root = 'http:// ...

  5. LCS

    /**LCS问题*/ #include <iostream>#include <string>#include <algorithm> using namespac ...

  6. get github

    Git是一个分布式的版本控制系统,最初由Linus Torvalds编写,用作Linux内核代码的管理.在推出后,Git在其它项目中也取得了很大成功,尤其是在Ruby社区中.目前,包括Rubinius ...

  7. 时间的处理 --java

    得到当天时间 SimpleDateFormat format = new SimpleDateFormat( "yyyy-MM-dd" ); String todayData = ...

  8. 一些css知识

    两个"::"和一个":"在css3中主要用来区分伪类和伪元素. 1.设置 placeholder属性: // firefox input::-moz-place ...

  9. sql sever读取Excel总结【转】

    主要用到openrowset,opendatasource系统函数,这两个函数任意一个都能完成任务 用这种方法可以实现Excel和sqlserver表之间的相互导入导出. openrowset的写法 ...

  10. c#文本框限制输入内容

         //限制输入不能为中文和全角         private void zhbh_KeyPress(object sender, KeyPressEventArgs e)         { ...