k近邻法是一种基本分类与回归方法。本章只讨论k近邻分类,回归方法将在随后专题中进行。

它可以进行多类分类,分类时根据在样本集合中其k个最近邻点的类别,通过多数表决等方式进行预测,因此不具有显式的学习过程。其本质是利用训练数据集对特征向量空间进行划分,并作为其分类的模型。k值选择、距离度量以及分类决策规则是其三个基本要素。

一、模型:

特征空间中,对每个训练点,距离该点比其他点更近的所有点组成一个区域(单元),每个训练点拥有一个区域(单元),所有训练点的区域(单元)构成对特征空间的一个划分。最近邻法将该点的类别作为所在单元中所有点的类标记。

二、距离度量

特征空间中两个点的距离反映了两个点的相似程度,可选距离包括Lp距离如欧式距离、曼哈顿距离,以及闵可夫斯基距离等。

三、k值选择

如果k值较小,以为着用较小的邻域中的训练样本进行预测,学习的近似误差会减小,但学习的估计误差会增大,预测结果对近邻点非常敏感。如果近邻点恰巧是噪声,预测就会出错,导致过拟合现象。如果k值较大,相当于用较大的领域中的训练样本进行预测,这样估计误差会减小,但学习的近似误差会增大。在实际应用中,通常采用交叉验证法来选取最有的k值。

四、分类决策规则

一般采用多数表决规则,等价于经验风险最小化。对给定的点x,如果涵盖*其最近邻的k个训练点构成的集合*的区域的类别是cj,那么误分类率是:

要是误分类率最小即经验风险最小,就要使得表决支持最多。

五、算法实现:kd树

k近邻算法要求快速对训练数据进行k近邻搜索,在特征空间维数大、训练样本容量大时尤为必要。k近邻算法的最简单实现方法是线性扫描,这时要计算输入实例与每一个训练实例的距离,显然当训练集很大时,计算是不可行的。为了提高搜索效率,可以考虑采用特殊的结构存储训练数据,以减少计算距离的次数,如kd树。

构造kd树:

kd树是一种对k维空间中的点进行存储以便于对其进行快速检索的树形数据结构。kd树是二叉树,表示对k维kj的一个划分。构造kd树相当于不断地用垂直于坐标轴的超平面将k维空间切分,构成一系列的k维超矩形区域,kd树的每一个结点对应于k维超矩形区域。

搜索kd树:

评价:

如果点是随机分布的,kd树搜索的平均计算复杂度为O(logN),N是训练样本数,kd树更适合于训练实例树远大于空间维数时的k近邻搜索,当空间维数接近训练实例树时,它的效率会迅速下降,几乎接近线性扫描。

【测试数据: sample.dat,test.dat】

【算法1: test.cpp, knn-kd.a,  knn-kd.so】

【算法2: test.cpp, knn-kd.a,  knn-kd.so】

最新文章

  1. eclipse插件
  2. WinPhone学习笔记(一)——页面导航与页面相关
  3. ubuntu linux 下wine的使用
  4. jQuery中each()、find()、filter()等节点操作方法
  5. inline-block 和 float 的区别
  6. 设计模式——设计模式之禅day2
  7. 第12届北师大校赛热身赛第二场 A.不和谐的长难句1
  8. Springboot项目maven多模块拆分
  9. 【洛谷P1706全排列问题】
  10. 简单检测PHP运行效率脚本
  11. Mongodb数据库学习
  12. Vue编译提示警告
  13. 孤岛营救问题 (BFS+状压)
  14. 基于SSL的MySQL主从
  15. .NetCore WebApi + Vue +MySql搭建博客
  16. Re:从零开始的Spring Session(三)
  17. Tomcat权威指南-读书摘要系列8
  18. [翻译]小提示:使用figure和figcaption元素的正确方式
  19. String.getBytes()[转]
  20. HTML5 canvas 圆盘抽奖

热门文章

  1. 解决Shiro注解无效的问题
  2. 微信开发-ACCESS TOKEN 过期失效解决方案
  3. Android广播机制的深入学习
  4. 黑马程序员_ C语言基础(二)
  5. NSTimer的使用[zhuang]
  6. selenium 介绍1
  7. 使用C#开发计划任务调度服务
  8. PHP二维码生成的方法(google APi,PHP类库,libqrencode等)
  9. Oracle中将查询出的多条记录的某个字段拼接成一个字符串的方法
  10. qt环境下Mapx组建的编程---------regoin