我学习FLANN,对近似最邻近搜索库。
对于LSH方法但是它们代表一个对象(在搜索空间中的点),为unsigned int的阵列。 我不知道他们为什么这样做,并不能代表一个点仅仅作为一个双阵列(其将代表多维向量空间中的点)。 也许是因为LSH用于二进制功能? 有人可以分享更多有关在这种情况下可能使用unsigned int型的? 为什么无符号整数,如果你只需要各功能的0和1?
谢谢
我学习FLANN,对近似最邻近搜索库。
对于LSH方法但是它们代表一个对象(在搜索空间中的点),为unsigned int的阵列。 我不知道他们为什么这样做,并不能代表一个点仅仅作为一个双阵列(其将代表多维向量空间中的点)。 也许是因为LSH用于二进制功能? 有人可以分享更多有关在这种情况下可能使用unsigned int型的? 为什么无符号整数,如果你只需要各功能的0和1?
谢谢
请注意,我指的是最新版本FLANN,即flann-1.8.3
在写作的时候。
对于LSH方法但是它们代表一个对象(在搜索空间中的点),为无符号整数的数组
编号:这是错误的。 所述LshIndex
类包括一个buildIndexImpl
实现该LSH索引方法。 由于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)
:
value
是unsigned 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执行工作在海明空间的二进制描述。
如果你使用与实际值的描述符(在R**d
)你应该指的是原始论文 ,其中包括有关如何将特征向量转换成二进制字符串,以便使用海明空间和散列函数的详细信息。
有人可以分享更多有关在这种情况下可能使用unsigned int型的? 为什么无符号整数,如果你只需要各功能的0和1?
见上面:在unsigned int
值仅用于存储每个特征向量的相关ID。