#distances #ann #algorithm #distance

anndists

Ann相关crate中使用的某些距离

3个版本

0.1.2 2024年5月13日
0.1.1 2024年4月29日
0.1.0 2024年4月29日

#1204算法

Download history 213/week @ 2024-04-24 54/week @ 2024-05-01 139/week @ 2024-05-08 51/week @ 2024-05-15 48/week @ 2024-05-22 252/week @ 2024-05-29 255/week @ 2024-06-05 253/week @ 2024-06-12 137/week @ 2024-06-19 99/week @ 2024-06-26

748 每月下载次数
用于 6 个crate(2直接使用)

MIT/Apache

71KB
1.5K SLoC

anndists

此crate提供了一些相关crate hnsw_rsannembedcoreset 中使用的距离计算

所有距离都实现了 Distance 特性

pub trait Distance<T: Send + Sync> {  
    fn eval(&self, va: &[T], vb: &[T]) -> f32;
}

功能

该crate提供

  • 标准数值类型向量的常用距离,如L1、L2、余弦、Jaccard、Hamming,以及u16上的Levenshtein距离。

  • 概率分布之间的Hellinger距离和Jeffreys散度(f32和f64)。需要注意的是,Jeffreys散度(对称化的Kullback-Leibler散度)不满足三角不等式。(余弦距离也不满足!)

  • 概率分布之间的Jensen-Shannon距离(f32和f64)。它定义为Jensen-Shannon散度的平方根,是一个有界度量。参见 Nielsen F. in Entropy 2019, 21(5), 485

  • 一个特性,允许用户实现自己的距离。它接受满足T:Serialize+Clone+Send+Sync的类型T的数据切片。也可以使用C extern函数或闭包。

  • 提供对最常用情况的Simd实现。

实现

Simd支持通过 simdeez crate在Intel上使用,以及通过 std::simd 的一般情况的部分实现。

构建

Simd

  • simdeez crate提供的Simd可以通过特征 "simdeez_f" 访问,用于x86_64处理器。使用 cargo build --release --features "simdeez_f" 编译 ... 要在M1芯片上编译此crate,只需不激活此功能。

  • 尽管如此,仍然可以与std::simd进行实验。使用特性stdsimd(cargo build --release --features "stdsimd")编译,在rust nightly上激活了portable_simd特性。这需要nightly编译器。目前只提供了u32x16和u64x8类型的Hamming距离以及f32*16上的DistL1、DistL2和DistDot。

基准测试和示例

速度在 hnsw_rsannembed crate中体现

贡献

Petter Egesund添加了DistLevenshtein距离。

许可证

许可协议为以下之一

由您选择。

依赖项

~4.5–6.5MB
~112K SLoC