Locality sensitive hashing(LSH)的关键思想是邻居点 v 更有可能
映射到同一个存储桶但彼此远离的点更可能映射到不同的存储桶。在使用随机投影时,如果数据库包含N个高维d的样本,那么理论上说我们必须创建k个随机生成的散列函数,其中k是目标缩减维度,表示为g(**v**) = (h_1(v),h_2(v),...,h_k(v))
。因此,对于任何矢量点 v ,该点被映射到具有g函数的k维向量。然后,哈希码是减小长度/维度k的向量,并且被视为桶。现在,为了增加碰撞的概率,理论上说我们应该随机地得到L个这样的g函数g_1, g_2,...,g_L
。这是我不理解的部分。
问题:如何创建多个哈希表?哈希表中包含多少个桶?
我正在遵循严夏等人在文件Sparse Projections for High-Dimensional Binary Codes
中给出的代码。 al Link to Code
在档案Coding.m
dim = size(X_train, 2);
R = randn(dim, bit);
% coding
B_query = (X_query*R >= 0);
B_base = (X_base*R >=0);
X_query
是每个维度d的查询数据集,并且有1000个查询样本; R
是随机投影,bit是目标减少维度。 B_query
和B_base
的输出为N
长度为k
的字符串,取0/1值。
这种方式是否会创建多个哈希表,即N
是哈希表的数量?我很困惑。详细解释将非常有用。
答案 0 :(得分:1)
如何创建多个哈希表?
LSH通过串联使用(放大的)哈希函数创建哈希表:
g(p) = [h<sub>1</sub>(p), h<sub>2</sub>(p), · · · , h<sub>k</sub> (p)], h<sub>i</sub> ∈<sub>R</sub> H
g()
是一个哈希函数,它对应一个哈希表。因此,我们通过g()
将数据映射到该哈希表,并且概率地,将关闭的数据放入同一个桶中,非关闭的数据库将落入不同的桶中。
我们这样做L
次,因此我们创建了L
哈希表。请注意,每个g()
最有可能与其他g()
哈希函数不同。
注意:大的k⇒P 1 之间的差距较大,P 2 。小P 1 ⇒larer L以便找到邻居。实际选择是L = 5(或6)。 P 1 和P 2 定义如下:
希望我知道!这是一个棘手的问题,哈希表中包含多少个桶?
sqrt(N)
如何N
是数据集中的点数。检查一下:Number of buckets in LSH
燕霞的代码
我对此并不熟悉,但根据您的说法,我相信您看到的查询数据的数量是1000,因为我们希望提出1000个查询。
k
是字符串的长度,因为我们必须哈希查询以查看它将映射到的哈希表的哪个桶。该桶内的点是潜在的(近似)最近邻居。