2013-01-12 29 views
6

Tôi đang nghiên cứu FLANN, một thư viện để tìm kiếm gần đúng hàng xóm gần nhất.Tính năng nhị phân và Nhạy cảm địa phương (LSH)

Đối với phương pháp LSH, chúng đại diện cho một đối tượng (điểm trong không gian tìm kiếm), như một mảng int không dấu. Tôi không chắc chắn lý do tại sao họ làm điều này, và không đại diện cho một điểm đơn giản như là một mảng đôi (mà sẽ đại diện cho một điểm trong không gian vector đa chiều). Có lẽ vì LSH được sử dụng cho các tính năng nhị phân ? Ai đó có thể chia sẻ thêm về việc sử dụng int chưa ký trong trường hợp này? Tại sao unsigned int nếu bạn chỉ cần 0 và 1 cho mỗi tính năng?

Cảm ơn

Trả lời

7

Xin lưu ý rằng tôi sẽ tham khảo các Flann phiên bản mới nhất, ví dụ: flann-1.8.3 tại thời điểm viết bài.

Đối với phương pháp LSH họ đại diện cho một đối tượng (điểm trong không gian tìm kiếm), như một mảng của unsigned int

Số: điều này là sai. Lớp LshIndex bao gồm phương thức buildIndexImpl triển khai lập chỉ mục LSH. Vì LSH về cơ bản là một tập hợp các bảng băm, việc lập chỉ mục hiệu quả xảy ra ở lớp LshTable.

Phương pháp lập chỉ mục tiểu học, tức là phương pháp mà chỉ một vector đặc trưng (aka mô tả, hoặc điểm) tại một thời điểm là:

/** 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) {...} 

Lưu ý: phương pháp buildIndexImpl sử dụng phiên bản thay thế mà chỉ đơn giản lặp trên các tính năng và gọi phương thức trên trên mỗi tính năng.

Như bạn có thể thấy phương pháp này có 2 đối số mà là một cặp (ID, descriptor):

  1. value đó là unsigned int đại diện cho vector đặc trưng nhận dạng số duy nhất (hay còn gọi là tính năng index)
  2. feature đại diện cho vector đặc trưng chính nó

Nếu bạn nhìn vào triển khai, bạn có thể thấy rằng bước đầu tiên bao gồm băm descripto giá trị r để có được chìa khóa xô liên quan (= xác định kiểu trỏ slot vào xô, trong đó mô tả ID này sẽ được lưu trữ):

BucketKey key = getKey(feature); 

Trong thực tế chức năng getKey băm là chỉ thực hiện cho mô tả nhị phân , tức là mô tả có thể được biểu diễn dưới dạng một mảng của unsigned char:

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

có lẽ vì LSH được sử dụng cho các tính năng nhị phân?

Có: như đã nêu ở trên, triển khai FLANN LSH hoạt động trong Hamming space cho các trình mô tả nhị phân.

Nếu bạn sử dụng mô tả có giá trị thực (trong R**d), bạn nên tham khảo original paper bao gồm chi tiết về cách chuyển đổi vectơ tính năng thành chuỗi nhị phân để sử dụng không gian Hamming và hàm băm.

Ai đó có thể chia sẻ thêm về khả năng sử dụng phần int chưa ký trong trường hợp này? Tại sao unsigned int nếu bạn chỉ cần 0 và 1 cho mỗi tính năng?

Xem ở trên: giá trị unsigned int chỉ được sử dụng để lưu trữ ID có liên quan của từng vector tính năng.

Các vấn đề liên quan