LSH:解决最近的neigbors搜索的实践

时间:2013-12-31 01:20:35

标签: algorithm machine-learning locality-sensitive-hash

  

"LSH has some huge advantages. First, it is simple. You just compute the hash for all points in your database, then make a hash table from them. To query, just compute the hash of the query point, then retrieve all points in the same bin from the hash table."

参考另一个问题的答案,我正在寻找LSH分析过程的澄清。 假设我有稀疏的特征向量(二进制,大多数为0),并且希望使用余弦距离作为具有阈值alpha的度量,这可能会有所不同。

  1. 我的第一步是计算每个向量的哈希值。距离测量是否重要? (我想是的)。门槛是否重要? (我想没有)。我怎样才能找到合适的哈希函数?

    如果是编程,我的功能就像:

    bytes[] getHash(Vector featureVec)

    然后我会将结果放在Map(long vectorId, bytes[] hashcode) <-vectorHashMap

  2. 然后我从哈希中创建哈希表(将哈希值放入箱中)。我想至少在这里阈值很重要。我怎么能这样做?

    如果是编程,那就像是:

    Map,Map createHashTable(Map vectorHashMap, long threshold)

    返回两张地图:Map of (hashCode, bucketId)Map of (bucketId, ListOfVectorIds)

  3. 然后我可以轻松地检索具有vectorId作为输入的neigbors和一个vectorIds列表作为输出。

1 个答案:

答案 0 :(得分:0)

哈希与距离测量无关。通过使用随机选择的向量点击向量,可以获得散列的每个位。该位表示散列矢量的随机矢量(真正的超平面)的哪一侧。这些位是哈希值。

是的,然后您通过哈希值索引矢量以便于检索。您不需要'桶ID' - 您的哈希就是您的桶。

这里唯一的问题是,所有最近的矢量都在它所散列的桶中并不是真的。他们只是倾向于靠近。如果它很重要,你可能不得不搜索“相似”的桶 - 只有几点不同的桶 - 来考虑更多的候选者并更好地找到真正最近的邻居。