我正在研究FLANN,一个用于近似近邻搜索的库。
对于LSH方法,它们表示一个对象(搜索空间中的点),如 一个unsigned int数组。我不确定他们为什么这样做,而不是 将一个点简单地表示为一个双数组(它代表一个点 在多维向量空间)。也许是因为LSH用于二进制 特征?有人可以分享更多关于可能使用unsigned int的信息 这个案例?为什么unsigned int如果每个特征只需要0和1?
由于
答案 0 :(得分:8)
请注意,我将在撰写本文时参考最新的FLANN版本,即flann-1.8.3
。
对于LSH方法,它们代表一个对象(搜索空间中的点), 作为unsigned int的数组
不:这是错的。 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
方法使用简单地迭代功能的替代版本,并在每个上调用上述方法。
如您所见,此方法有两个参数,即(ID, descriptor)
对:
value
unsigned int
代表特征向量唯一数字标识符(又称要素索引)feature
代表特征向量本身如果查看实现,您可以看到第一步包括散列描述符值以获取相关的桶密钥(=指向将存储此描述符ID的存储区的槽的标识符):< / p>
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的信息 案件?为什么unsigned int如果每个特征只需要0和1?
见上文:unsigned int
值仅用于存储每个特征向量的相关ID。