KD 树总结
相似向量的召回是推荐系统中召回阶段中非常重要的一个步骤,便利所有向量的召回方法性能太差,KD树先对向量空间进行了切分,只需要检索部分向量空间就可以获得检索结果,大大加快了检索效率。
如果实例点是随机分布的,kd树的时间复杂度是O(logN)
KD 树的构造
1. 选择切分向量空间的维度,常用的有两种方法:
(1)按顺序选择切分维度,第一次选第1维,第二次选择2维,第n次选择n%k维,k维向量总维度
(2)寻找方差最大的维度(每个维度选择次数要一致)
2. 选择切分节点,一半是把该维度数据中位数作为父节点,小于该节点的落入左子树,大于该节点的落入右子树
重复上面1,2步,直到叶子节点只包含一个实例
例子
KD树检索方法
1. 输入一个查询节点,首先在KD树中找到包含该节点的叶子节点
2. 以此叶节点作为“当前最近节点”
3. 递归的进行以下操作:
a. 回退到父节点,如果该节点保存的实例点比当前最近点距离目标更近,这更新当前最近点为该节点。
b. 判断该节点的另一个子节点对应的区域是否和以查询点为球心,以查询点和当前最近点之间的距离为半径的超球体相交。如果相交,可能在该子节点内存在距查询点更近的节点,需要进入该子节点检索。否者继续向上回退。
c. 当回退到根节点时检索结束。
例子