21个版本 (10个重大更新)

0.11.0 2021年7月19日
0.9.1 2021年7月11日
0.6.1 2020年4月4日
0.6.0 2020年3月6日
0.3.1 2019年9月6日

#2298算法

Download history 52/week @ 2024-03-11 12/week @ 2024-03-18 5/week @ 2024-03-25 63/week @ 2024-04-01 17/week @ 2024-04-08 7/week @ 2024-04-15 33/week @ 2024-04-22 15/week @ 2024-04-29 4/week @ 2024-05-06 9/week @ 2024-05-13 22/week @ 2024-05-20 9/week @ 2024-05-27 28/week @ 2024-06-03 10/week @ 2024-06-10 17/week @ 2024-06-17 22/week @ 2024-06-24

每月下载量 78
用于 3 crates

MIT 许可证

37KB
606

hnsw

Discord Crates.io MIT/Apache docs.rs LoC

用于快速近似最近邻搜索的层次可导航小世界图

启用serde功能以序列化和反序列化HNSW

提示

M和M0参数的一个好的默认值是12和24。根据论文,M0应该总是M的两倍,但你可以自由地更改它们。

示例

要查看如何与汉明空间一起使用,请参阅tests/simple_discrete.rs。要查看如何与欧几里得空间一起使用,请参阅tests/simple.rs

请注意,测试中的欧几里得实现可能存在一些数值错误,并且可能无法实现三角不等式,特别是在高维情况下。请使用Kahan求和算法进行正确使用。它也可能无法利用SIMD,但使用数组可能会有所帮助。

请参阅space文档有关距离的特性和类型。它还包含特殊的Bits128 - Bits4096元组结构体,这些结构体包装字节数组并启用SIMD功能。提供的基准测试使用这些SIMD实现。

基准测试

以下是您可以与之比较的召回图

Recall Graph

有关更多基准测试和如何进行基准测试的信息,请参阅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