简介

K-D Tree, K-Dimensional Tree, 对高维的点作空间划分的一种二叉树.

传统的文本搜索是这样的:
一个doc 有若干个field, 分词后添加到倒排索引中, 然后按照 tf-idf 等思想计算match(query,doc), 然后取得分最高的top-k.

那么对于高维的点或向量 v=(x1,...,xd)v=(x_1, ... , x_d), 即给出一个集合 S={v|v∈Rd}S=\{v |v \in \mathbb R^d\}, 怎么做指定点vv 在集合SS中的 k-近邻 搜索呢?
最朴素的思想, 就是暴力遍历, 作 O(n)O(n) 时间复杂度的操作.
但问题变复杂时, 如:

  1. 集合非常大, 百万级
  2. 维度d很大, 两三百维
  3. 数据类型为float, 计算两元素间距离 distance(a,b) 的代价较大

此时, 为了提升搜索效率, 就需要建索引, 就用到了K-D Tree.

1. 建树

像回归决策树一样, 不断地找划分点, 递归地得到树.
这里的划分点就是(split_dimension,split_value ).
便于说明, 用ndarray类型的变量A表示数据集, A.shape=(n,m)
流程见下:

  1. 对当前集合S,求出方差最大的那一维

    split_dimension=argmaxdvariance(A[:,d])

    split\_dimension = \arg \max_d variance(A[: , d])

  2. 在上步找到维度d之后, 求出该维度分量的中位数:
    split_value=median(A[:,d])

    split\_value=median(A[:,d])

  3. 确定(split_dimension,split_value )之后, 对集合作划分, 得到子集 S1,S2S_1,S_2, 分别做左右子树. 再递归地重复上述步骤, 直至对整个数据集划分完毕.

2. 搜索

代码

疑问

以 欧氏距离 做度量, 搜索K-近邻 很直观, 那 余弦距离呢?

参考

  1. wikipedia, k-d tree
  2. How to use a KdTree to search
  3. scipy,KDTree_example
  4. 一篇 cnblog,KNN算法与Kd树

K-D 树, 高维空间索引相关推荐

  1. PCL之K维树--KD-tree

    原理:KD-tree 又称 K 维树是计算机科学中使用的一种数据结构,用来组织表示 K 维空间中点集合.它是一种带有其他约束条件的二分查找树.KD-tree对于区间和近邻搜索十分有用.我们为了达到目的 ...

  2. LeetCode高频题:戈壁滩种树,一排n棵树,至少有k棵树存活时,最终形成的风景线有多少不同的情况

    LeetCode高频题:戈壁滩种树,一排n棵树,至少有k棵树存活时,最终形成的风景线有多少不同的情况 提示:本题是系列LeetCode的150道高频题,你未来遇到的互联网大厂的笔试和面试考题,基本都是 ...

  3. 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树状数组套主席树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1901 首先还是吐槽时间,我在zoj交无限tle啊!!!!!!!!我一直以为是程序错了啊啊啊啊啊啊. ...

  4. 从K近邻算法、距离度量谈到KD树、SIFT+BBF算法

    原文出自:http://blog.csdn.net/v_JULY_v/article/details/8203674 前言 前两日,在微博上说:"到今天为止,我至少亏欠了3篇文章待写:1.K ...

  5. 【转】从K近邻算法、距离度量谈到KD树、SIFT+BBF算法

    最近在看<统计学习方法>,发现这么一篇好文章,与大家分享 转自:http://blog.csdn.net/v_july_v/article/details/8203674?reload 前 ...

  6. Boost库-功能介绍-Geometry-R树-空间索引

    文章目录 1.空间几何关系 2.最近邻查询 3.函数查询 4.作者寄语   R树是一种多级平衡树,它是B树在多维空间上的扩展.在R树中存放的数据并不是原始数据,而是这些数据的最小边界矩形(MBR),空 ...

  7. k-d tree树 近邻算法

    k-d树(k-dimensional树的简称),是一种分割k维数据空间的数据结构.主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索). 应用背景 SIFT算法中做特征点匹配的时候就会利用到k ...

  8. 机器学习算法(二十五):KD树详解及KD树最近邻算法

    目录 1 KD树 1.1 什么是KD树 1.2 KD树的构建 1.3 KD树的插入 1.4 KD树的删除 1.5 KD树的最近邻搜索算法 1.5.1 举例:查询点(2.1,3.1) 1.5.2 举例: ...

  9. KD树详解及KD树最近邻算法

    参考:http://blog.csdn.net/app_12062011/article/details/51986805 http://www.cnblogs.com/snake-hand/arch ...

最新文章

  1. Eclipse 快捷键(转载)
  2. 图片上传之后清空_OSS文件上传及OSS与ODPS之间数据连通
  3. Jquery中实现表单提交前的校验
  4. 利用Python延迟初始化提升性能
  5. php7 jpgraph,JpGraph4.0.2中文乱码以及在php7.0版本无法显示的解决办法
  6. C++ 对象没有显式初始化
  7. spark实战@wordcount-处理目录下的多个文件
  8. Linux系统下matplotlib中文乱码解决办法
  9. PID算法之模糊PID
  10. 计算机考研C语言题库
  11. 没有这个传奇工程师,就没有今天的 Windows
  12. 栈——后入先出的数据结构(LIFO)
  13. 电源的输出纹波噪声究竟该取多少才合适?
  14. 兄弟扫描机无法连接计算机,可以网络打印, 但是不能进行网络扫描。
  15. python3爬取新浪微博_Python3爬取新浪微博头条
  16. vue-loader
  17. XGBoost之分位点算法
  18. Intel opencl sdk下载安装
  19. 多线程3——线程连接、分离和取消(linux)
  20. ServerSocket通过构造方法绑定端口

热门文章

  1. codeforces 618 C. Constellation(三角形,三点共线)
  2. msp430流水灯c语言程序,MSP430单片机流水灯程序
  3. [python爬虫]暴力破解Wifi密码
  4. Android五大数据存储
  5. 跨平台第三方平台登录和单点登录
  6. python selenuim自动签到京东网页版
  7. kubeadm join时报错Unauthorized
  8. 《云计算与大数据》课程报告
  9. 修改我的世界服务器怪物爆率,精英生成概率以及部分能力参数设置_我的世界精英怪mod教程如何调控怪物属性和掉落物__单机攻略_跑跑车单机游戏网...
  10. widows下如何修改Visual Studio2017的字体颜色