K近邻算法即是查找与当前点(向量)距离最近的K个点(向量),距离计算一般用欧氏距离。
最简单的方法就是穷举法:计算每个向量与当前向量的欧氏距离,选取最小的K个为所求。但这种方法计算量太大,无法应对大样本数的情况(比如SIFT特征点匹配,每张图片一般有几千个待匹配的特征点,对每个点都需要查找另一张图片中与之最相似的特征点从而建立对应关系,穷举法显然不行)。
SIFT采用的方法是:先将所有特征向量进行预处理,组成KD树的结构(二叉树),仅计算KD树中可能路径下(使用了BBF改进算法计算路径)特征向量的欧式距离,从而减小计算量。
本文将首先介绍KD树的构造,然后介绍KD树下的最近邻查找,最后介绍KD树下改进的查找方法BBF。
KD树的构造
KD树(k-dimension tree)是对数据点在K维空间中划分的一种数据结构
假设对于6个二维数据点(此时K=2):{(2,3), (5,4), (9,6), (4,7), (8,1), (7,2)}
(1)计算所有数据每一维的方差
在这里即计算(2, 5, 9, 6, 4, 7, 8)和(3, 4, 6, 7, 1, 2)的方差,分别为39和28.63
方差大的那一维(在这里为x轴)意味着当前数据在这一维分布最为分散,因此首先将数据按这一维进行划分
(2)选取方差最大的那一维中所有数据的中位数作为分割超面(根节点)
在这里选第一维(X轴)的数据,中位数为7,因此将x=7作为第一个分割超平面(点