学习KNN算法体会和总结
k-d树(k-dimensional树的简称),是一种切割k维数据空间的数据结构。主要应用于多维空间重要数据的搜索(如:范围搜索和近期邻搜索)。
索引结构中相似性查询有两种主要的方式:一种是范围查询(range searches),还有一种是K近邻查询(K-neighbor searches)。范围查询就是给定查询点和查询距离的阈值。从数据集中找出全部与查询点距离小于阈值的数据;K近邻查询是给定查询点及正整数K,从数据集中找到距离查询点近期的K个数据,当K=1时。就是近期邻查询(nearest neighbor
searches)。
特征匹配算子大致能够分为两类。
一类是线性扫描法。即将数据集中的点与查询点逐一进行距离比較,也就是穷举。缺点非常明显,就是没有利用数据集本身蕴含的不论什么结构信息,搜索效率较低,第二类是建立数据索引。然后再进行高速匹配。
由于实际数据一般都会呈现出簇状的聚类形态,通过设计有效的索引结构能够大大加快检索的速度。索引树属于第二类,其基本思想就是对搜索空间进行层次划分。依据划分的空间是否有混叠能够分为Clipping和Overlapping两种。
前者划分空间没有重叠,其代表就是k-d树;后者划分空间相互有交叠。其代表为R树。(这里仅仅介绍k-d树)
实例
先以一个简单直观的实例来介绍k-d树算法。
如果有6个二维数据点{(2,3),(5,4),(9,6),(4,7),(8,1)。(7,2)}。数据点位于二维空间内(如图1中黑点所看到的)。k-d树算法就是要确定图1中这些切割空间的切割线(多维空间即为切割平面。一般为超平面)。以下就要通过一步步展示k-d树是怎样确定这些切割线的。
k-d树算法能够分为两大部分,一部分是有关k-d树本身这样的数据结构建立的算法,还有一部分是在建立的k-d树上怎样进行最邻近查找的算法。
到这里位置,上边都是抄的别人的,下边是自己的一点总结。
kd树的创建是一个递归的过程:
開始:确定切分域,这个格局你的特征向量一共同拥有多少维,假如是一个N维向量,而且有M个这种向量。那么你须要计算每个维上边的方差。选取方差大的那个维作为切分域。方差的计算公式 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHVtMjAwOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">。
然后,对依靠这个维上边的值对向量进行升序排序。
选取这个维上边的中位数作为根节点。讲空间切分为两部分,左边和后边的空间域,递归的对两个空间域进行切分。分别增加到二叉树的左右两个孩子节点。
k-d树上的最邻近查找算法
在k-d树中进行数据的查找也是特征匹配的重要环节。其目的是检索在k-d树中与查询点距离近期的数据点。
这里先以一个简单的实例来描写叙述最邻近查找的基本思路。
星号表示要查询的点(2.1,3.1)。
通过二叉搜索。顺着搜索路径非常快就能找到最邻近的近似点,也就是叶子节点(2,3)。而找到的叶子节点并不一定就是最邻近的,最邻近肯定距离查询点更近,应该位于以查询点为圆心且通过叶子节点的圆域内。为了找到真正的近期邻,还须要进行'回溯'操作:算法沿搜索路径反向查找是否有距离查询点更近的数据点。此例中先从(7,2)点開始进行二叉查找。然后到达(5,4)。最后到达(2,3),此时搜索路径中的节点为<(7,2),(5,4),(2,3)>。首先以(2,3)作为当前近期邻点。计算其到查询点(2.1,3.1)的距离为0.1414,然后回溯到其父节点(5,4),并推断在该父节点的其它子节点空间中是否有距离查询点更近的数据点。以(2.1,3.1)为圆心,以0.1414为半径画圆,如图4所看到的。
发现该圆并不和超平面y
= 4交割。因此不用进入(5,4)节点右子空间中去搜索。
再回溯到(7,2),以(2.1,3.1)为圆心。以0.1414为半径的圆更不会与x = 7超平面交割,因此不用进入(7,2)右子空间进行查找。
至此,搜索路径中的节点已经所有回溯完,结束整个搜索。返回近期邻点(2,3)。近期距离为0.1414。
一个复杂点了样例如查找点为(2。4.5)。
相同先进行二叉查找。先从(7,2)查找到(5,4)节点,在进行查找时是由y = 4为切割超平面的。因为查找点为y值为4.5。因此进入右子空间查找到(4,7)。形成搜索路径<(7,2),(5,4),(4,7)>。取(4,7)为当前近期邻点,计算其与目标查找点的距离为3.202。然后回溯到(5,4),计算其与查找点之间的距离为3.041。
以(2。4.5)为圆心。以3.041为半径作圆,如图5所看到的。
可见该圆和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切割超平面交割,如图6所看到的。至此。搜索路径回溯完。返回近期邻点(2,3),近期距离1.5。
k-d树查询算法的伪代码如表3所看到的。
上述两次实例表明,当查询点的邻域与切割超平面两側空间交割时,须要查找还有一側子空间。导致检索过程复杂,效率下降。研究表明N个节点的K维k-d树搜索过程时间复杂度为:tworst=O(kN1-1/k)。
我这里对kd树的搜索过程中的回溯推断是否当查询点的邻域与切割超平面两側空间交割时。当向量不是二维而是多维的情况。这里应该是一个球,须要对其他各个维都要计算,假设有一个相切或者相交,那么就必须搜索查询点的右孩子。
学习KNN算法体会和总结的更多相关文章
- 利用Python实现kNN算法
邻近算法(k-NearestNeighbor) 是机器学习中的一种分类(classification)算法,也是机器学习中最简单的算法之一了.虽然很简单,但在解决特定问题时却能发挥很好的效果.因此,学 ...
- 人工智能之KNN算法
转载自:https://www.cnblogs.com/magic-girl/p/python-kNN.html 基于python实现的KNN算法 邻近算法(k-NearestNeighbor) 是机 ...
- 【StatLearn】统计学习中knn算法实验(2)
接着统计学习中knn算法实验(1)的内容 Problem: Explore the data before classification using summary statistics or vis ...
- 【转载】K-NN算法 学习总结
声明:作者:会心一击 出处:http://www.cnblogs.com/lijingchn/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接, ...
- K-NN算法 学习总结
1. K-NN算法简介 K-NN算法 ( K Nearest Neighbor, K近邻算法 ), 是机器学习中的一个经典算法, 比较简单且容易理解. K-NN算法通过计算新数据与训练数据特征值之间的 ...
- Opencv学习之路—Opencv下基于HOG特征的KNN算法分类训练
在计算机视觉研究当中,HOG算法和LBP算法算是基础算法,但是却十分重要.后期很多图像特征提取的算法都是基于HOG和LBP,所以了解和掌握HOG,是学习计算机视觉的前提和基础. HOG算法的原理很多资 ...
- 机器学习算法-K-NN的学习 /ML 算法 (K-NEAREST NEIGHBORS ALGORITHM TUTORIAL)
1为什么我们需要KNN 现在为止,我们都知道机器学习模型可以做出预测通过学习以往可以获得的数据. 因为KNN基于特征相似性,所以我们可以使用KNN分类器做分类. 2KNN是什么? KNN K-近邻,是 ...
- 学习OpenCV——KNN算法
转自:http://blog.csdn.net/lyflower/article/details/1728642 文本分类中KNN算法,该方法的思路非常简单直观:如果一个样本在特征空间中的k个最相似( ...
- kNN算法学习(一)
1.首先需要一些训练样本集,例如一道问题(数据)及答案(标签),可以看做一条样本,那么多条,就是样本集 当然这里应该是一条数据及该数据所属的分类,该类别称为标签 2.现在我们已经知道数据与所属类别的对 ...
随机推荐
- QT 制作串口调试小助手----(小白篇)
一.成品图展示 简介:因zigbee实验,制作一个相对简易版的上位机,接收来自zigbee无线传感采集的温湿度.光照等数据. 并且将数据部分描绘成实时动态折线统计图. 二.主要功能介绍 主要使用QT自 ...
- Gson 转日期中的错误
今天在用Gson做json转化是遇到一个问题,本地执行没有问题(windows 7),包丢到服务器上(Centos)就报错了. 后经分析发现DateTypeDapter类中取本地环境的日期格式参考ht ...
- 《Typecript 入门教程》 2、访问控制符:public、private、protected、readonly
声明类的属性和方法时可以设置使用访问控制符,访问控制符设置类的属性和方法能不能在类的外部被访问 1. 默认为 public,使用public定义的属性和方法在类的内部和外部都可以访问 2. priva ...
- HTML--使用提交按钮,提交数据
在表单中有两种按钮可以使用,分别为:提交按钮.重置.这一小节讲解提交按钮:当用户需要提交表单信息到服务器时,需要用到提交按钮. 语法: <input type="submit" ...
- 题解报告:hdu 2647 Reward(拓扑排序)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2647 Problem Description Dandelion's uncle is a boss ...
- S2深入.NET编程总结
不知从几何时,我也开始变得懒了,以往为了学习的那股子斗劲也早已不在,是时候反思反思了.失败的检测成绩希望可以把我唤醒. 经过总结,在本书中大概学到了这些知识: 1.如果一个类可序列化,则它的子类和包含 ...
- Android 微信分享不出去?四步搞定!
现在做的项目中集成了友盟分享,产品要求集成微信.朋友圈.QQ.QQ空间.短信这几个分享平台.按照友盟的文档集成一切都很顺利,集成成功以后测试QQ.QQ空间.短信都没有问题,唯独微信和朋友圈一直分享不出 ...
- [Android]异常7-Error:Configuration with name 'default' not found.
背景:使用SVN更新代码,运行出现 异常原因: 可能一>缺少Modules 解决办法有: 解决一>Android Studio切换为Project,settings.gradle中引用和现 ...
- CommandBehavior.CloseConnection使用
其用在ExecuteReader(c)中,返回对象前不能关闭数据库连接,须用CommandBehavior.CloseConnection: 这是一个关于实际知识点的问题,面试官考查的是应聘者数据库访 ...
- html5——2D转换
transform 属性 1.向元素应用 2D 或 3D 转换 2.该属性允许我们对元素进行旋转.缩放.移动或倾斜. 缩放与位移 transform: scale(, 0.5);//水平缩放,垂直缩放 ...