二进制特征和局部敏感哈希 (LSH)

Posted

技术标签:

【中文标题】二进制特征和局部敏感哈希 (LSH)【英文标题】:Binary features and Locality Sensitive Hashing (LSH) 【发布时间】:2012-12-27 02:40:17 【问题描述】:

我正在研究 FLANN,一个用于近似最近邻搜索的库。

对于 LSH 方法,它们表示一个对象(搜索空间中的点),如 一个无符号整数数组。我不确定他们为什么这样做,而不是 将一个点简单地表示为一个双精度数组(这将表示一个点 在多维向量空间中)。也许是因为 LSH 用于二进制 特征?有人可以分享更多关于可能使用 unsigned int in 这个案例?如果每个功能只需要 0 和 1,为什么要使用 unsigned int?

谢谢

【问题讨论】:

【参考方案1】:

请注意,在撰写本文时,我将参考最新的 FLANN 版本,即flann-1.8.3

对于 LSH 方法,它们表示一个对象(搜索空间中的点), 作为一个无符号整数数组

不:这是错误的。 LshIndex 类包括一个实现 LSH 索引的 buildIndexImpl 方法。由于 LSH 基本上是哈希表的集合,因此有效的索引发生在 LshTable 类上。

基本索引方法,即一次索引一个特征向量(又名描述符或点)的方法是:

/** Add a feature to the table
 * @param value the value to store for that feature
 * @param feature the feature itself
 */
void add(unsigned int value, const ElementType* feature) ...

注意:buildIndexImpl 方法使用的替代版本只是简单地迭代特征,并在每个特征上调用上述方法。

如您所见,此方法有 2 个参数,它们是一对 (ID, descriptor)

    valueunsigned int 表示特征向量唯一数字标识符(又名特征索引) feature 代表特征向量本身

如果您查看实现,您可以看到第一步包括对描述符值进行哈希处理以获得相关的桶键(= 指向将存储此描述符 ID 的桶的槽的标识符):

BucketKey key = getKey(feature);

实际上,getKey 散列函数为二进制描述符实现,即可以表示为 unsigned char 数组的描述符:

// Specialization for unsigned char
template<>
inline size_t LshTable<unsigned char>::getKey(const unsigned char* feature) const ...

可能是因为 LSH 用于二进制特征?

是的:如上所述,FLANN LSH 实现适用于二进制描述符的Hamming space。

如果您要使用具有实值的描述符(在R**d 中),您应该参考original paper,其中包含有关如何将特征向量转换为二进制字符串以便使用汉明空间和哈希函数的详细信息。

有人可以分享更多关于 unsigned int 的可能用途吗? 案子?如果每个功能只需要 0 和 1,为什么要使用 unsigned int?

见上图:unsigned int值仅用于存储每个特征向量的相关ID。

【讨论】:

以上是关于二进制特征和局部敏感哈希 (LSH)的主要内容,如果未能解决你的问题,请参考以下文章

LSH(局部敏感哈希)算法

局部敏感哈希(Locality-Sensitive Hashing, LSH)方法介绍(转)

局部敏感哈希(Locality-Sensitive Hashing, LSH)

局部敏感哈希LSH

locality sensitive hashing(LSH)局部敏感哈希

局部敏感哈希(LSH)之simhash和minhash