21个版本 (10个重大更新)
0.11.0 | 2021年7月19日 |
---|---|
0.9.1 | 2021年7月11日 |
0.6.1 | 2020年4月4日 |
0.6.0 |
|
0.3.1 | 2019年9月6日 |
#2298 在 算法
每月下载量 78
用于 3 crates
37KB
606 行
hnsw
用于快速近似最近邻搜索的层次可导航小世界图
启用serde
功能以序列化和反序列化HNSW
。
提示
M和M0参数的一个好的默认值是12和24。根据论文,M0应该总是M的两倍,但你可以自由地更改它们。
示例
要查看如何与汉明空间一起使用,请参阅tests/simple_discrete.rs
。要查看如何与欧几里得空间一起使用,请参阅tests/simple.rs
。
请注意,测试中的欧几里得实现可能存在一些数值错误,并且可能无法实现三角不等式,特别是在高维情况下。请使用Kahan求和算法进行正确使用。它也可能无法利用SIMD,但使用数组可能会有所帮助。
请参阅space
文档有关距离的特性和类型。它还包含特殊的Bits128
- Bits4096
元组结构体,这些结构体包装字节数组并启用SIMD功能。提供的基准测试使用这些SIMD实现。
基准测试
以下是您可以与之比较的召回图
有关更多基准测试和如何进行基准测试的信息,请参阅benchmarks.md
。
实现
这基于由Yu. A. Malkov和D. A. Yashunin撰写的论文《使用层次可导航小世界图进行高效且鲁棒的近似最近邻搜索》"Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs"。这篇论文建立在原始论文NSW的基础上。作者还撰写了关于NSW的多篇论文,这些论文在HNSW之前。
有关参数和实现细节的更多详细信息,请参阅implementation.md
。
致谢
这绝对不是对原始实现的直接复制或重实现。这是纯粹基于该论文制作的,没有参考原始头文件。论文写得很好,易于理解,只有一些小例外。感谢作者们的宝贵贡献。
有问题?贡献?兴奋吗?
请访问Rust CV Discord。
依赖项
~2MB
~33K SLoC