簡體   English   中英

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

[英]Binary features and Locality Sensitive Hashing (LSH)

我正在研究FLANN,一個用於近似最近鄰搜索的庫。

對於LSH方法,它們表示一個對象(搜索空間中的點),作為unsigned int的數組。 我不確定他們為什么這樣做,並且不能簡單地表示為雙數組(它代表多維向量空間中的一個點)。 也許是因為LSH用於二進制功能? 在這種情況下,有人可以分享更多關於unsigned int的可能用途嗎? 為什么unsigned int如果每個功能只需要0和1?

謝謝

請注意,我將在撰寫本文時參考最新的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)

  1. unsigned int value表示特征向量唯一數字標識符(也稱為特征索引)
  2. 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的可能用途嗎? 為什么unsigned int如果每個功能只需要0和1?

見上文: unsigned int值僅用於存儲每個特征向量的相關ID。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM