LSB-Tree

来源:互联网 发布:淘宝上买四轮电动车 编辑:程序博客网 时间:2024/05/19 19:57

应用:高维空间的最近邻居搜索,比如在协同过滤系统中找到与你最相似的用户等应用。

从数据库的角度,好的解决方案应该有如下两个特征:

1)很容易和关系型数据库兼容;

2)查询开销随着数据集的增大应该线性的增长,而与数据和查询分布无关;

LSH(Locality sensitive hashing,局部敏感哈希算法)是满足两个特征的经典方法。但是它的实现或是需要昂贵的空间和查询开销,或是丧失对查询结果质量的理论保证。所以香港中文大学的陶宇飞等人提出了LSB-Tree算法,提供快速,准确的关系数据库上的高维NN搜索。许多LSB-Tree组成的LSB-Tree森林在保证与LSH同样查询质量的前提下提高了效率。实际上,LSB-Tree本身是一个消耗线性空间,支持效率更新,提供准确查询结果的高效索引。

在本文进行的实验里,LSB-Tree比iDistance查询快,比MedRank结果更准确。

第二步,本文扩展了LSB技术来解决经典的高维空间CP搜索问题。目前这一问题的挑战是在高维空间中,时间复杂度达到次平方时间。LSB-forest,CP搜索的最差完成时间也要显著地小于平方时间复杂度,并且保证了很好的查询质量。

在本文的实验里,LSB-forest比distance browsing查询快,比D-shift算法结果更准确。

 

Introduction

NN(最近邻居)搜索是一个经典的问题,影响着人工智能,模式识别,信息挖掘等许多领域。D是包含有节点集的高维空间,给定一个查询点q,它的最近邻居是点image,没有其他点image满足:imageimage 表示两点间距离。

顺序扫描 通过检查整个数据集的方式解决NN查询,但是其开销随着D的维数线性增长。根据上面所说的两个要求,这种方法是不令人满意的。现在没有任何现存一种方法能够同时达到这两个要求。

LSH是现在唯一满足两个条件的已知解决方法。它提供c近似的NN搜索。c近似NN搜索,若点o是q的c-近似NN,假如o到q的距离最多是q到其精确NN o*的c倍,即image ,其中c》1是近似率。LSH分为严格LSH和adhoc-LSH,其中严格LSH保证查询质量,但是需要昂贵的空间和查询开销。adhoc-LSH更有效率,但是其摒弃了查询质量控制。没有一个LSH算法满足效率和查询质量的兼顾。

本文提出来LSB-Tree可以保证快速的高维NN搜索的同时保证准确的查询质量。多个LSB-Tree可以组合成叫LSB-forest的结构,其联合了严格和adhoc-LSH的优点而没有它们的缺点,查询质量同严格LSH,而查询开销小于adhoc-LSH,并且能适应关系型数据库。

所有LSH实现都需要拷贝数据库多次,因此会造成很大的空间开销和更新花费。许多应用偏向于索引这种花费线性空间,支持有效率的插入和删除操作。LSB-Tree把每个数据节点在传统的B-Tree中储存一次来满足这些要求。

第二步,在高维空间解决CP问题,即在给定的点集D中找到所有点对中距离最近的一对点。本文挑战的是当维数增加,取得优于平方完成时间的时间复杂度,即优于扫描所有点对的方法。CP问题的c近似版本是返回一个点对,它们之间的距离至多为最短点对距离的c倍。

在NN上下文中,尽管一个好的理论上的表现需要一个LSB-forest,但实际上只有两棵LSB-Tree就可以返回足够精确的结果,这是其减少空间和查询开销的重要原因。

Problem Setting

下面是几个假定:

1,假定每一个维度都在[0,t]这个范围内,其中t是一个整数;

2,假定点的坐标是整数;

3,距离由image 范式测量得出。例,假如所有的维都是二进制数,则image是海明码;

4,研究问题是c-近似NN搜索,其中c是一个正整数。我们假设上文说的q不在D中,否则NN问题就变成了一个查找问题,可以用标准hash简单的解决。NN查询的直接扩展时KNN搜索,在D中找到距q最近的K个点,第i个点是真正的第i个NN的c近似。

5,设定数据集D存储在外存上,每页有B个词,我们遵照如下传统,每一个整数或真实数字表示一个词;一个点有d维,则整个数据集有d*n/B个页,n是D的基数。换句话说,所有其他算法的IO复杂度都为image ,本文要设计一个基于关系的解决方案来解决这个问题。

6,第二个需要解决的问题是c近似CP问题。不成熟的方法是检查所有的点对,时间复杂度为n^2;注意到cp问题有色子对应,即两个数据集imageimageimageimage中距离最小的点对,c近似的点对 image ,使image ;cp问题可以扩展为Kcp问题,同上面的KNN;

7,M是可用内存的容量,用词数来衡量,需要的最小空间是3B,其中不包括存储查询结果的内存,KNN,KCP需要的o(kd)的空间。

8,理论分析,假设一个点可以容纳在常数的磁盘页中,设常数为10,则其支持的维度可以达到10B,一般假设维度d>image ,则实践中image很少能达到20,则d=20是其最高维度。

The Preliminaries

严格LSH和ball over

LSH没有直接解决c近似NN搜索问题,相反,它是为了c近似ball over设计的。D是高维空间的点集,B(q,r)表示一个球,球心是查询点q,半径为r。一个c近似BC查询返回如下结果

1)如果B(q,r)至少包含D的一个点,返回一个点其到q的距离至多为cr

2)假如B(q,r)不包含D中的任意点,返回空

3)否则,结果不确定

image

c近似ball over

image

空间开销:image

IO开销:image

其高花费的根源是:严格LSH查询必须支持许多次image 不同半径的BC查询。

Adhoc-LSH

image

给定一个NN查询q,它们返回位置为q,半径为image的BC查询的结果,其中image 是系统预先决定的“魔法”半径。所以只需要支持一个半径,所以开销为image 的空间开销和image 的时间开销。

不幸的是,adhoc-LSH的开销减少是用对查询结果的质量控制的下降来交换的。

image

图3表示image过大或过小对查询结果造成的影响。现实中,一个恰当的image是很难得到的,随着具体应用和数据不同,所需要的image也是不一样的。

image

图4表明,由于聚类的稀疏度不同,不存在一个好的image

总结,应用者应用LSH算法的时候,面临着从大开销和不保证结果准确性两者中选一的问题。而本文的LSB-Tree的提出解决了这个问题。

 

Details of hash functions

Hash函数将d维点变成1维值。它是局部敏感的,假如随着imageimage 距离的缩小,匹配imageimage到同一值的概率变大。

LSH定义:

给定距离r,近似度c,概率值image image ,其中image >image,哈希函数h(.)是(r,cr,image ,image局部敏感的,假如它满足下面两个条件:

1) 假如image ,则image

2) 假如image ,则image

一个流行的LSH函数被定义如下:

image

其中,image表示代表o点的d维向量;image是另一个d维向量,每一个分量都在p稳定分布上;image表示两个向量的积,w是个大常数,b在[0.w)中。

等式一有一个简单几何说明:

image

如图5, 假设p=2,image 是欧式距离。2稳定分布可只是一个正态分布(期望是1,方差是0),设w=4(参见其他论文),假定维数为2,图5中穿过区域的线的斜率等于clip_image001的方向,为了方便,clip_image001[1]单位化,则点集clip_image002是o到clip_image001[2]的投影,也就是图中的A,clip_image003的作用是将A沿着线移动距离b到点B。最后,假定我们将该直线分成长度为w的区域,则hash值h(o)是包含了B的分段的ID。

然后我们发现,假如两个点彼此接近,则它们有更高的概率落在同一个区域内。

定理1,等式1是(1, c,clip_image004 ,clip_image005)局部敏感的,则clip_image004[1]clip_image005[1]是两个常数,满足clip_image006

LSB-Tree

Build a LSB-Tree

LSB-Tree的构建主要有以下几个步骤:

给定一个d维的数据集D

1, 将每一个点clip_image001[1]转换到m维的点G(o)

2, 获得G(o)的Z顺序值z(o),注意,z(o)只是一个简单的数。

3, 将z(o)用B-Tree进行索引,做成LSB-Tree,坐标存储在叶子节点中

将每一个点clip_image001[2]转换到m维的点G(o)

定义G(o)的维度m为:

clip_image002[1]

clip_image003[1]是给定的定理1在c=2的时候常数,n是数据集D的大小,B是页的大小。注意,c=2不是强制的,本文算法可以计算任意的c>=2。

哈希函数:

clip_image004[1]

clip_image005[1]是D维向量,它的每一个分量都服从独立的正态分布(期望是0,方差是1),clip_image006[1]clip_image007上的均匀分布,w是最小值为4的常数,并且

clip_image008

注意clip_image009,w和等式1中的相同,clip_image010不同,这是LSB-Tree提高效率的一个重要设计。

本文随机选择m 个哈希函数clip_image011,则G(o)是m维向量:

clip_image012

从G(0)到z(o)

U表示m维空间G(o)的轴长。选择U的值,使U/w是2的幂。计算z排序曲线需要超网划分空间。我们引入一个超网,每一个单元是一个边长为w的超方格,因此每个维度有U/w个单元,总共有clip_image013个单元。在网格中计算Z排序G(o)的z(o)是一个标准过程,见其他论文。令u=log(U/w),每个z(o)因此是长度为um比特的二进制串。

clip_image014

U的选择

除了U/w是2的幂,还需满足两个条件:

1)clip_image015

2)clip_image016对任意clip_image017,至多为U/2

O分布在空间clip_image018,t是每一维度中的最大坐标。因此

clip_image019

Nearest neighbor algorithm
一棵LSB-Tree已经能产生质量足够好的查询结果了。为了评估质量到理论级,本文建立了l棵独立的LSB-Tree,选择
clip_image020
保证临近的点clip_image021在至少一棵树上有相近的Z排序值。
将l棵树表示为clip_image022,叫它们LSB-forest,使用clip_image023表示树clip_image024的Z排序值。本文让clip_image023[1]指到clip_image025树上的叶节点o
给定一个NN查询q,本文先得到它每棵树上的Z排序值clip_image026clip_image026[1]是个um比特的二进制串。clip_image027表示clip_image026[2]clip_image023[2]的最长共同前缀。
例,假如zj(o) = 100101 and zj(q) = 100001,则LLCP(zj(o), zj(q)) = 3。当q明显与上下文无关时,LLCP(zj(o), zj(q)) 简化为LLCP of zj(o)
下图是NN算法:
clip_image028
该算法的主要思想是遍历L棵树的叶节点,找到它们LLCP的降序排列。直到找到足够多的点或是找到足够近的点为止。
找到最大的LLCP
可以通过所有树的叶子层的双向同步扩张来实现。
搜索Tj用Z排序值的比zj(q)大的最低点来定位叶节点clip_image029clip_image030clip_image029[1]前一个叶子节点。
clip_image031
LLCP包含在clip_image032中。
终止条件

当事件E1和and E2发生时,NN查询终止:

E1:l棵LSB-Tree的叶子节点总数达到了4Bl/d

E2:发现的最近的点距q的距离至多为clip_image033

例:图8

假设数据集包含点o1, o2, ..., o4,查询是黑点q,假设clip_image034

clip_image035

图8中clip_image036有着最大的LLCP v=5,因此NN1得到o4,计算距q的距离,因为clip_image037,不满足E2条件,假设E1也被违反(比如,令4Bl/d >1),算法计算下一个条目的最大LLCP,z1(o3)的LLCP=4,NN1找到o3代替o4为最近点。因为clip_image038,E2满足,所以NN1终止,返回o3

检索K邻居

NN1可以简单地适用于解答KNN查询。将E1修改为叶子总数达到clip_image039,E2修改为距q距离为clip_image040到第K个点

原创粉丝点击