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)
:
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)
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.