K-D 树, 高维空间索引
简介
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) 时间复杂度的操作.
但问题变复杂时, 如:
- 集合非常大, 百万级
- 维度d很大, 两三百维
- 数据类型为float, 计算两元素间距离 distance(a,b) 的代价较大
此时, 为了提升搜索效率, 就需要建索引, 就用到了K-D Tree.
1. 建树
像回归决策树一样, 不断地找划分点, 递归地得到树.
这里的划分点就是(split_dimension,split_value ).
便于说明, 用ndarray类型的变量A表示数据集, A.shape=(n,m)
流程见下:
- 对当前集合S,求出方差最大的那一维
split_dimension=argmaxdvariance(A[:,d])
split\_dimension = \arg \max_d variance(A[: , d])
- 在上步找到维度d之后, 求出该维度分量的中位数:
split_value=median(A[:,d])
split\_value=median(A[:,d])
- 确定(split_dimension,split_value )之后, 对集合作划分, 得到子集 S1,S2S_1,S_2, 分别做左右子树. 再递归地重复上述步骤, 直至对整个数据集划分完毕.
2. 搜索
代码
疑问
以 欧氏距离 做度量, 搜索K-近邻 很直观, 那 余弦距离呢?
参考
- wikipedia, k-d tree
- How to use a KdTree to search
- scipy,KDTree_example
- 一篇 cnblog,KNN算法与Kd树
K-D 树, 高维空间索引相关推荐
- PCL之K维树--KD-tree
原理:KD-tree 又称 K 维树是计算机科学中使用的一种数据结构,用来组织表示 K 维空间中点集合.它是一种带有其他约束条件的二分查找树.KD-tree对于区间和近邻搜索十分有用.我们为了达到目的 ...
- LeetCode高频题:戈壁滩种树,一排n棵树,至少有k棵树存活时,最终形成的风景线有多少不同的情况
LeetCode高频题:戈壁滩种树,一排n棵树,至少有k棵树存活时,最终形成的风景线有多少不同的情况 提示:本题是系列LeetCode的150道高频题,你未来遇到的互联网大厂的笔试和面试考题,基本都是 ...
- 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树状数组套主席树)
http://www.lydsy.com/JudgeOnline/problem.php?id=1901 首先还是吐槽时间,我在zoj交无限tle啊!!!!!!!!我一直以为是程序错了啊啊啊啊啊啊. ...
- 从K近邻算法、距离度量谈到KD树、SIFT+BBF算法
原文出自:http://blog.csdn.net/v_JULY_v/article/details/8203674 前言 前两日,在微博上说:"到今天为止,我至少亏欠了3篇文章待写:1.K ...
- 【转】从K近邻算法、距离度量谈到KD树、SIFT+BBF算法
最近在看<统计学习方法>,发现这么一篇好文章,与大家分享 转自:http://blog.csdn.net/v_july_v/article/details/8203674?reload 前 ...
- Boost库-功能介绍-Geometry-R树-空间索引
文章目录 1.空间几何关系 2.最近邻查询 3.函数查询 4.作者寄语 R树是一种多级平衡树,它是B树在多维空间上的扩展.在R树中存放的数据并不是原始数据,而是这些数据的最小边界矩形(MBR),空 ...
- k-d tree树 近邻算法
k-d树(k-dimensional树的简称),是一种分割k维数据空间的数据结构.主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索). 应用背景 SIFT算法中做特征点匹配的时候就会利用到k ...
- 机器学习算法(二十五):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 举例: ...
- KD树详解及KD树最近邻算法
参考:http://blog.csdn.net/app_12062011/article/details/51986805 http://www.cnblogs.com/snake-hand/arch ...
最新文章
- Eclipse 快捷键(转载)
- 图片上传之后清空_OSS文件上传及OSS与ODPS之间数据连通
- Jquery中实现表单提交前的校验
- 利用Python延迟初始化提升性能
- php7 jpgraph,JpGraph4.0.2中文乱码以及在php7.0版本无法显示的解决办法
- C++ 对象没有显式初始化
- spark实战@wordcount-处理目录下的多个文件
- Linux系统下matplotlib中文乱码解决办法
- PID算法之模糊PID
- 计算机考研C语言题库
- 没有这个传奇工程师,就没有今天的 Windows
- 栈——后入先出的数据结构(LIFO)
- 电源的输出纹波噪声究竟该取多少才合适?
- 兄弟扫描机无法连接计算机,可以网络打印, 但是不能进行网络扫描。
- python3爬取新浪微博_Python3爬取新浪微博头条
- vue-loader
- XGBoost之分位点算法
- Intel opencl sdk下载安装
- 多线程3——线程连接、分离和取消(linux)
- ServerSocket通过构造方法绑定端口
热门文章
- codeforces 618 C. Constellation(三角形,三点共线)
- msp430流水灯c语言程序,MSP430单片机流水灯程序
- [python爬虫]暴力破解Wifi密码
- Android五大数据存储
- 跨平台第三方平台登录和单点登录
- python selenuim自动签到京东网页版
- kubeadm join时报错Unauthorized
- 《云计算与大数据》课程报告
- 修改我的世界服务器怪物爆率,精英生成概率以及部分能力参数设置_我的世界精英怪mod教程如何调控怪物属性和掉落物__单机攻略_跑跑车单机游戏网...
- widows下如何修改Visual Studio2017的字体颜色