kd-tree和K近邻

KNN,K近邻算法

K Nearest Neighbor算法,就是找K个最近的邻居,当K=1时,退化成找最近的那个邻居。(Supervoxel的k-means聚类过程中就是找最近的一个点加标为该类,再更新中心点。)

它最简单的在分类上的应用,是这样描述的:以二分类为例,要判断某点属于哪类,先找到这点附近最近的k点,用这k个点投票决定待判定点属于哪类,如果多数都投A类,那么待判定点被判为A类,反之B类。

K值的选择

K值的选择很关键,不能过大,不能过小,一般用 交叉验证法 :选取一部分做训练集,一部分做测试集来选取最优的K值。

过小的话:相当于用较小部分的数据做训练集,只有在输入数据离训练集很接近的情况才能比较符合预测的分类;
优点:“学习” 近似误差 会减小;
缺点:“学习”的 估计误差 会增大,整体模型变复杂,容易发生 过拟合

过大的话:
优点:“学习”的估计误差减小;
缺点:“学习”的近似误差会增大,整体模型变简单。

KD树——k近邻算法的实现

    Kd-树是K-dimension tree的缩写,是多维二叉搜索树,是为了在多维数据中搜索在一个区域(与查询点数据距离小于某阈值)的数据或搜索某目标数据的K个邻近。(范围搜索和最近邻搜索)

     每个节点即为一个k维的点。每个非叶节点可以想象为一个分割超平面,用垂直于坐标轴的超平面将空间分为两个部分,这样递归的从根节点不停的划分,直到没有实例为止。

1975年,来自斯坦福大学的Jon Louis Bentley在ACM杂志上发表的一篇论文:Multidimensional Binary Search Trees Used for Associative Searching 中正式提出和阐述的了如下图形式的把空间划分为多个部分的k-d树。


3D上使用kd-tree

所有数据都是三维的,构建的k-d树就是3-d tree,树的每层都是按某一维度来划分的,比如根节点之下的第一层都是按x轴的大小划分,如果比根节点的x值小,放在左子树上;若比根节点x值大,放在右子树上。
通常用类似快排的Partition思想,每次把中值放在当前根节点,比根节点i轴值小的放在左子树,大的放在右子树。下一层按照y轴Partition,再下一层按照z轴Partition。逐层递归构建左右子树直到只剩一个节点。

They most efficient way to build a k-d tree is to use a partition method like the one Quick Sort uses to place the median point at the root and everything with a smaller one dimensional value to the left and larger to the right. 

近邻的几种距离表示法

这里谈到距离度量是为了判定之前所说的谁比较近的问题。
(1)欧氏距离:我们常用的直线距离,坐标差平方和开方;
        向量表示方法:
                
(2)曼哈顿距离:在街区的一个十字路口驶向另一个十字路口的驾驶距离。两点在坐标系方向的投影的距离和。
(1)二维平面两点a(x1,y1)与b(x2,y2)间的曼哈顿距离 
(2)两个n维向量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的曼哈顿距离 

                          

(3)标准化欧氏距离(Standardized Euclidean Distance)
     标准化欧氏距离是针对简单欧氏距离的缺点而作的一种改进方案。标准欧氏距离的思路:既然数据各维分量的分布不一样,那先将各个分量都“标准化”到均值、方差相等。至于均值和方差标准化到多少,先复习点统计学知识。

    假设样本集X的数学期望或均值(mean)为m,标准差(standard deviation,方差开根)为s,那么X的“标准化变量”X*表示为:(X-m)/s,而且标准化变量的数学期望为0,方差为1。
     即,样本集的标准化过程(standardization)用公式描述就是:
     
     标准化后的值 =  ( 标准化前的值  - 分量的均值 ) /分量的标准差  
     经过简单的推导就可以得到两个n维向量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的标准化欧氏距离的公式:  
     
     如果将方差的倒数看成是一个权重,这个公式可以看成是一种加权欧氏距离(Weighted Euclidean distance)。 

(4)夹角余弦——向量方向的差异性

两个n维样本点a(x11,x12,…,x1n)和b(x21,x22,…,x2n)的夹角余弦

     

值越大表示夹角越小,差异性越小;反之差异越大。



Reference

K近邻算法的实现--KD树,和KD树的插入,删除,最近邻查找等操作,及KD树的一系列相关改进(包括BBF,M树等)
http://blog.csdn.net/v_july_v/article/details/8203674/
3D上使用kd-tree  http://pointclouds.org/documentation/tutorials/kdtree_search.php#kdtree-search
                  API: http://docs.pointclouds.org/trunk/group__kdtree.html

你可能感兴趣的:(kd-tree和K近邻)