面试官考查的最近邻搜索,不仅属于机器学习基础理论KNN的范畴,并且在实际工作比如 召回ANN 检索中也经常用到,如果小明当初能早些看到并行世界中我总结的这个图谱,肯定会有不一样的结果。
这次我们就先来总结下 最近邻算法(NN)中的KD树的相关知识点。
问题的产生
最近邻搜索(Nearest Neighbor Search)是指在一个确定的距离度量和一个搜索空间内寻找与给定查询项距离最小的元素。暴力搜索的解法时间复杂度是O(n), 使用KD-tree 能降低时间复杂度。
由于维数灾难,我们很难在高维欧式空间中以较小的代价找到精确的最近邻。近似最近邻搜索(Approximate Nearest Neighbor Search)则是一种通过牺牲精度来换取时间和空间的方式从大量样本中获取最近邻的方法。
KD-tree
KD-tree 是K-dimension tree的缩写,是对数据点在k维空间中划分的一种数据结构。
本质上,k-d树是一种空间划分树,是一种平衡二叉树。将整个k维的向量空间不断的二分,从而划分为若干局部空间,然后搜索的时候,不断进行分支判断,选择其中的局部子空间,避免了全局空间搜索。
举个例子,当k=3 的时间,KD-tree 就会将三维空间分割成如下图的形式: