高维最近邻搜索和局部敏感哈希

时间:2010-07-16 07:06:36

标签: python math

这是主要问题。我有48个维向量的非常大的数据库(25,000左右),每个向量的值都在0-255之间。具体细节并不那么重要,但我认为它可能有助于提供背景。

我不需要最近邻居,因此可以接受精确度范围内的近似邻居搜索。我一直在玩Locality Sensitivity Hashing,但我非常迷失。

我已经尽可能地编写了“稳定分布”一文中描述的哈希函数。这是代码。

def lsh(vector, mean, stdev, r = 1.0, a = None, b = None):
 if not a:
  a = [normalvariate(mean, stdev) for i in range(48)]
 if not b:
  b = uniform(0, r)
 hashVal = (sum([a[i]*vectorA[i] for i in range(48)]) + b)/r
 return hashVal

哈希函数至少在某些方面“正在工作”。如果我通过哈希值订购点列表并计算列表中点与其邻居之间的平均距离,则平均距离约为400,而任意两个随机选择点的平均距离约为530.

我最大的问题是这些。

答:有关我可以在哪里阅读更多相关信息的任何建议。我的搜索没有产生很多结果。

B:该方法建议输出一个整数值(我的不是)。然后你应该尝试找到这个整数值的匹配,匹配表示可能最近的邻居。我理解我应该为我的所有点计算一组哈希值表,然后检查所表的哈希匹配,但我返回的值似乎不够好,我最终会得到完全匹配。我需要进行更多测试。

C:有关如何根据其他散列方法构造散列函数的说明?

2 个答案:

答案 0 :(得分:2)

Maby这有点偏离主题,但您可以尝试使用PCA http://en.wikipedia.org/wiki/Principal_component_analysis来减少数据集的维度。应该有大量为numPy设计的PCA模块(例如:http://folk.uio.no/henninri/pca_module/)。 该方法相当简单,并且随时可以使用模块。

它的基本功能是通过最大化给定维数内的方差来减少维数(您应该能够指定所需数量)。

答案 1 :(得分:2)

以下是两个答案:

B :维基百科页面表明应在math.floor()上使用hashVal:这是获取整数的方式。

C :如果你想使用汉明方法,你可以很简单地实现它:每个汉明哈希函数只是由一个坐标(在0和47之间)和一个位数(在0和7)。您可以使用以下符号获取给定位b的整数值:

bool(i & 2**b)