K近邻分类法
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近邻算法
百度百科:Kd树:
李航 《统计学习方法》
博客:http://blog.csdn.net/likika2012/article/details/39619687
K近邻分类法的更多相关文章
- OpenCV手写数字字符识别(基于k近邻算法)
摘要 本程序主要参照论文,<基于OpenCV的脱机手写字符识别技术>实现了,对于手写阿拉伯数字的识别工作.识别工作分为三大步骤:预处理,特征提取,分类识别.预处理过程主要找到图像的ROI部 ...
- K近邻法(KNN)原理小结
K近邻法(k-nearst neighbors,KNN)是一种很基本的机器学习方法了,在我们平常的生活中也会不自主的应用.比如,我们判断一个人的人品,只需要观察他来往最密切的几个人的人品好坏就可以得出 ...
- k近邻算法(knn)的c语言实现
最近在看knn算法,顺便敲敲代码. knn属于数据挖掘的分类算法.基本思想是在距离空间里,如果一个样本的最接近的k个邻居里,绝大多数属于某个类别,则该样本也属于这个类别.俗话叫,"随大流&q ...
- 机器学习实战笔记--k近邻算法
#encoding:utf-8 from numpy import * import operator import matplotlib import matplotlib.pyplot as pl ...
- k近邻(KNN)复习总结
摘要: 1.算法概述 2.算法推导 3.算法特性及优缺点 4.注意事项 5.实现和具体例子 6.适用场合内容: 1.算法概述 K近邻算法是一种基本分类和回归方法:分类时,根据其K个最近邻的训练实例的类 ...
- scikit-learn K近邻法类库使用小结
在K近邻法(KNN)原理小结这篇文章,我们讨论了KNN的原理和优缺点,这里我们就从实践出发,对scikit-learn 中KNN相关的类库使用做一个小结.主要关注于类库调参时的一个经验总结. 1. s ...
- 学习笔记——k近邻法
对新的输入实例,在训练数据集中找到与该实例最邻近的\(k\)个实例,这\(k\)个实例的多数属于某个类,就把该输入实例分给这个类. \(k\) 近邻法(\(k\)-nearest neighbor, ...
- k近邻
k近邻(k-NearestNeighbor)算法简称kNN.基本思想简单直接,对于一个需要分类的数据实例x,计算x与所有已知类别的样本点在特征空间中的距离.取与x距离最近的k个样本点,统计这些样本点所 ...
- 机器学习PR:k近邻法分类
k近邻法是一种基本分类与回归方法.本章只讨论k近邻分类,回归方法将在随后专题中进行. 它可以进行多类分类,分类时根据在样本集合中其k个最近邻点的类别,通过多数表决等方式进行预测,因此不具有显式的学习过 ...
随机推荐
- MemCache缓存multiget hole详解
multiget 是什么 multiget 指的是从 memcache(或其他分布式缓存) 一次性获得多个键值,一般由 memcached client 自行实现. multiget hole是什么 ...
- 使用automake等命令自动生成Makefile文件 (转载)
使用automake等命令自动生成Makefile文件 Linux下编程时,为了方便编译,往往使用Makefile文件自动完成编译,但是Makefile文件本身的书写十分复杂,规则很多.好在Lin ...
- [C语言入门笔记]变量与数据类型
变量与数据类型 什么是变量? 变量是一个变化的量 是内存中的一个空间 变量的定义方法是什么? 数据类型 变量名 = 值; 数据类型有哪些? 整型int 浮点型float double 字符型char ...
- jQuery刷新包含的<jsp:include>页面
jQuery刷新包含页面 JQuery刷新包含页面,以下两种形式均可: <%@include file="../include/header.jsp" %> < ...
- ArcGIS Add-in插件开发从0到1及实际案例分享
同学做毕设,要求我帮着写个ArcGIS插件,实现功能为:遍历所有图斑,提取相邻图斑的公共边长及其他属性(包括相邻图斑的ID),链接到属性表中.搞定后在这里做个记录.本文分两大部分: ArcGIS插件开 ...
- js的Promise学习笔记(1)
1: 何为Promise Promise是抽象异步处理对象以及对其对象进行各种操作的组件,是基于并列/并行处理设计的一种编程语言. 说到基于JavaScript的异步处理,大多数都会想到利用回调函数. ...
- Linux内核分析课程总结
Linux内核分析课程总结 By 20135203齐岳 知识梳理 (思维导图地址http://mindmap.4ye.me/mkxM0cFh/1) 从start _ kernel构造一个新的Linux ...
- Windows Store App JavaScript 开发:小球运动示例
通过前面内容的学习,相信读者已经对开发基于JavaScript的Windows应用商店应用有了一定的了解,本小节通过一个小球运动的示例来介绍如何新建一个JavaScript的Windows应用商店项目 ...
- [转] c# 模拟Asp.net页面中的某个按钮的点击,向web服务器发出请求
在没有做题目中所述的内容的时候,感觉这应该是很简单的东西,但是当真正开始做的时候却发现,有很多问题现在在这里写出来,供和我一样水平不高的参考一下. 在写本文之前参照了一下文章 欢迎使用CSDN论坛阅读 ...
- mac 安装mvn 失败
安装过程遇到2个问题 1.java版本不对 2.Error: JAVA_HOME is not defined correctly. We cannot execute $/usr/libexec/j ...