hnswlib -向量ANN检索库

文章目录

    • 关于 hnswlib
    • 安装
    • 使用示例
      • 1、创建索引,插入元素,搜索和选择序列
      • 2、序列化/反序列化后更新


关于 hnswlib

Header-only C++/python library for fast approximate nearest neighbors

  • github : https://github.com/nmslib/hnswlib

hnswlib 是一个用于高维向量的快速最近邻搜索(ANN)的C++库,其设计基于 Hierarchical Navigable Small World(HNSW)算法。
HNSW 算法是一种基于图的近似最近邻搜索方法,旨在高效地在高维向量空间中找到与给定查询向量最相似的向量。


以下是 hnswlib 的一些主要特点和功能:

  1. 高维向量支持:hnswlib 专注于处理高维向量,适用于各种需要处理大量高维数据的应用场景,如图像搜索、文本检索、推荐系统等。
  2. HNSW 算法:HNSW 算法是 hnswlib 的核心,它利用图结构和局部连接性来构建一个高效的索引结构,使得在高维空间中进行最近邻搜索变得高效可行。
  3. 多线程支持:hnswlib 支持多线程并行处理,可以利用多核处理器提高搜索性能。
  4. 内存友好:hnswlib 设计优化了内存使用,能够高效地管理和存储大规模的高维向量数据。
  5. 灵活的参数配置:用户可以根据自己的需求灵活配置索引结构和搜索参数,以满足不同应用场景的需求。
  6. 易于集成:hnswlib 提供了简洁易用的C++接口,方便用户集成到自己的应用中使用。

hnswlib 的主要优势在于其高效的最近邻搜索性能和对高维向量的友好支持,使其成为处理大规模高维数据的理想选择。
它已经被广泛应用于各种领域,包括机器学习、数据挖掘、自然语言处理等。
同时,hnswlib 也提供了 Python 接口,方便 Python 用户使用。


相关文章

  • 「向量召回」相似检索算法——HNSW
    https://mp.weixin.qq.com/s/dfdNj9CZ3Kj2UwDr9PQcVg

安装

pip install hnswlib

从源码安装

apt-get install -y python-setuptools python-pip
git clone https://github.com/nmslib/hnswlib.git
cd hnswlib
pip install .

使用示例

C++ 示例:https://github.com/nmslib/hnswlib/blob/master/examples/cpp/EXAMPLES.md


1、创建索引,插入元素,搜索和选择序列

import hnswlib
import numpy as np
import pickledim = 128
num_elements = 10000# Generating sample data
data = np.float32(np.random.random((num_elements, dim)))
ids = np.arange(num_elements)# Declaring index
p = hnswlib.Index(space = 'l2', dim = dim) # possible options are l2, cosine or ip# Initializing index - the maximum number of elements should be known beforehand
p.init_index(max_elements = num_elements, ef_construction = 200, M = 16)# Element insertion (can be called several times):
p.add_items(data, ids)# Controlling the recall by setting ef:
p.set_ef(50) # ef should always be > k# Query dataset, k - number of the closest elements (returns 2 numpy arrays)
labels, distances = p.knn_query(data, k = 1)# Index objects support pickling
# WARNING: serialization via pickle.dumps(p) or p.__getstate__() is NOT thread-safe with p.add_items method!
# Note: ef parameter is included in serialization; random number generator is initialized with random_seed on Index load
p_copy = pickle.loads(pickle.dumps(p)) # creates a copy of index p using pickle round-trip### Index parameters are exposed as class properties:
print(f"Parameters passed to constructor:  space={p_copy.space}, dim={p_copy.dim}") 
print(f"Index construction: M={p_copy.M}, ef_construction={p_copy.ef_construction}")
print(f"Index size is {p_copy.element_count} and index capacity is {p_copy.max_elements}")
print(f"Search speed/quality trade-off parameter: ef={p_copy.ef}")

2、序列化/反序列化后更新

import hnswlib
import numpy as npdim = 16
num_elements = 10000# Generating sample data
data = np.float32(np.random.random((num_elements, dim)))# We split the data in two batches:
data1 = data[:num_elements // 2]
data2 = data[num_elements // 2:]# Declaring index
p = hnswlib.Index(space='l2', dim=dim)  # possible options are l2, cosine or ip# Initializing index
# max_elements - the maximum number of elements (capacity). Will throw an exception if exceeded
# during insertion of an element.
# The capacity can be increased by saving/loading the index, see below.
#
# ef_construction - controls index search speed/build speed tradeoff
#
# M - is tightly connected with internal dimensionality of the data. Strongly affects memory consumption (~M)
# Higher M leads to higher accuracy/run_time at fixed ef/efConstructionp.init_index(max_elements=num_elements//2, ef_construction=100, M=16)# Controlling the recall by setting ef:
# higher ef leads to better accuracy, but slower search
p.set_ef(10)# Set number of threads used during batch search/construction
# By default using all available cores
p.set_num_threads(4)print("Adding first batch of %d elements" % (len(data1)))
p.add_items(data1)# Query the elements for themselves and measure recall:
labels, distances = p.knn_query(data1, k=1)
print("Recall for the first batch:", np.mean(labels.reshape(-1) == np.arange(len(data1))), "\n")# Serializing and deleting the index:
index_path='first_half.bin'
print("Saving index to '%s'" % index_path)
p.save_index("first_half.bin")
del p# Re-initializing, loading the index
p = hnswlib.Index(space='l2', dim=dim)  # the space can be changed - keeps the data, alters the distance function.print("\nLoading index from 'first_half.bin'\n")# Increase the total capacity (max_elements), so that it will handle the new data
p.load_index("first_half.bin", max_elements = num_elements)print("Adding the second batch of %d elements" % (len(data2)))
p.add_items(data2)# Query the elements for themselves and measure recall:
labels, distances = p.knn_query(data, k=1)
print("Recall for two batches:", np.mean(labels.reshape(-1) == np.arange(len(data))), "\n")

伊织 2024-03-06(三)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/726581.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统架构设计师 2023年 综合知识

1、McCabe度量法的公式 V(G)=m-n+2。V(G)表示环路复杂性,m表示图中的边数,n表示图中的结点数。 2、McCabe度量法的规模 模块规模以V(G)<=10为宜。 3、多线程任务通信方式 共享内存、消息传递、信号、套接字、管道。 4、星型拓扑结构 最多只需要2跳就可以完成跟网络中任…

使用pdf.js预览pdf遇到的问题总结

我先说一下问题点&#xff1a; 最近项目做了一次改造&#xff0c;是关于iobs的。用户上传的pdf资料和图片等文件都是上传到iobs上&#xff0c; 所以用户需要预览或者页面返显图片的时候&#xff0c;都是从iobs上拿。之前拿到iobs链接之后&#xff0c;可以在一定的时间内无限次…

three.js如何实现简易3D机房?(三)显示信息弹框/标签

接上一篇&#xff1a; three.js如何实现简易3D机房&#xff1f;(二&#xff09;模型加载的过渡动画&#xff1a;http://t.csdnimg.cn/onbWY 目录 七、创建信息展示弹框 1.整体思路 &#xff08;1&#xff09;需求&#xff1a; &#xff08;2&#xff09;思路&#xff1a;…

网康科技 NS-ASG 应用安全网关 SQL注入漏洞复现(CVE-2024-2022)

0x01 产品简介 网康科技的NS-ASG应用安全网关是一款软硬件一体化的产品,集成了SSL和IPSec,旨在保障业务访问的安全性,适配所有移动终端,提供多种链路均衡和选择技术,支持多种认证方式灵活组合,以及内置短信认证、LDAP令牌、USB KEY等多达13种认证方式。 0x02 漏洞概述 …

生物电信号测量技术

引言 生物电信号是生物体内的电活动产生的电流或电压信号&#xff0c;它反映了生物体的生理状态和活动。生物电信号测量技术是一种用于记录和分析这些信号的方法&#xff0c;广泛应用于医学、生物学、神经科学等领域。本文将介绍几种常见的生物电信号测量技术&#xff0c;并讨…

C语言第三十六弹---文件操作(中)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 文件操作 1、文件的顺序读写 1.1、顺序读写函数介绍 1.1.1、fgetc 与 fputc 1.1.2、fgets 与 fputs 1.1.3、fscanf 与 fprintf 1.1.4、fread 与 fwrite 1.…

全志D1s开发板裸机开发之坏境搭建

环境搭建 开发板介绍 张天飞老师编写的《RISC-V体系结构编程与实践》&#xff0c;里面的源码是基于 QEMU 模拟器的&#xff0c;可以认为它是一款虚拟的开发板。如果需要在真实开发板上学习&#xff0c;可以使用百问网的 DongshanPI-D1S 开发板。 DongshanPI-D1S 是百问网推出…

Python web自动化测试 —— 文件上传!

​文件上传三种方式&#xff1a; &#xff08;一&#xff09;查看元素标签&#xff0c;如果是input&#xff0c;则可以参照文本框输入的形式进行文件上传 方法&#xff1a;和用户输入是一样的&#xff0c;使用send_keys 步骤&#xff1a;1、找到定位元素&#xff0c;2&#…

Git分支操作

Git分支操作 理解分支查看当前分支git branch 查看有几个分支git branch 新分支的名字 创建新分支git checkout -b 分支名 直接创建并切换到该分支下 切换分支git checkout 分支名 切换到指定分支 合并分支git merge 分支名 合并指定名字的分支 删除分支git branch -d 分支 删…

(力扣题库)跳跃游戏II(c++)

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] (表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 nums[n - 1] 的…

Linux:kubernetes(k8s)探针的简介(7)

相当于我们用于监控容器的一个东西&#xff0c;通过给我们的不同探针来判断容器内的状态情况&#xff0c;实现故障的一个自动恢复。 我们在上一章的yaml文件中写入了一个这个东西 那么他什么情况下重启&#xff0c;就是通过探针进行一个监控&#xff0c;加入监控某一个端口&…

云原生(一)、linux快速上手

Linux是一种开源的Unix-like操作系统内核。它是由Linus Torvalds于1991年首次发布&#xff0c;其后经过全球的自由软件社区的持续开发和改进。Linux内核是操作系统的核心部分&#xff0c;但通常与GNU项目合作&#xff0c;以形成完整的操作系统&#xff0c;被称为Linux发行版&am…

C语言从入门到实战——预处理详解

预处理详解 前言一、预定义符号1.1 __FILE__1.2__LINE__1.3 __DATE__1.4__TIME__1.5__STDC__ 二、 #define定义常量三、 #define定义宏四、 带有副作用的宏参数五、 宏替换的规则六、宏函数的对比七、 #和##7.1 #运算符7.2 ##运算符 八、 命名约定九、 #undef十、命令行定义十一…

ROS从入门到精通4-2:Docker安装ROS、可视化仿真与终端复用

目录 0 专栏介绍1 Docker安装ROS2 Docker可视化仿真2.1 显示配置2.2 启动容器 3 终端复用工具3.1 session操作3.2 window操作3.3 pane操作3.4 其他操作 0 专栏介绍 本专栏旨在通过对ROS的系统学习&#xff0c;掌握ROS底层基本分布式原理&#xff0c;并具有机器人建模和应用ROS…

C 嵌套 if 语句

在 C 语言中&#xff0c;嵌套 if-else 语句是合法的&#xff0c;这意味着您可以在一个 if 或 else if 语句内使用另一个 if 或 else if 语句。 语法 C 语言中 嵌套 if 语句的语法&#xff1a; if( boolean_expression 1) {/* 当布尔表达式 1 为真时执行 */if(boolean_expres…

机器学习项目的流程:从数据到部署

目录 前言1 数据收集1.1 任务定义与数据需求明确1.2 数据采集与清洗 2 模型训练2.1 数据预处理2.2 选择适当的模型2.3 模型训练与调优2.4 模型评估 3 模型部署3.1 部署环境准备3.2 模型集成3.3 测试和优化 4 模型维护和更新4.1 模型性能监测4.2 数据漂移处理4.3 定期更新模型 结…

Unity 整体界面淡入淡出效果

在Unity中&#xff0c;如果我们要实现控制多个组件同时淡出&#xff0c;同时淡入的效果&#xff0c;可以使用DOTween插件实现。 如图&#xff0c;一个页面中带有背景&#xff0c;一张图片&#xff0c;一个文本&#xff0c;一个滑动条。 要实现以上界面的整体淡入淡出&#xff…

⁴ 大龄IT青年,自动化测试是否是你不错的出路。

转型自动化测试是不是一个很好的职业转变选择。以下是一些步骤和建议&#xff0c;帮助你成功转型为自动化测试工程师&#xff1a; 1. 了解自动化测试的基础知识&#xff1a;自动化测试是通过编写脚本和使用工具来执行测试任务的过程。你需要学习编程语言&#xff08;如Python、…

Node.js概述与安装运行浅记

Node.js概述 Node.js 是一个开源、跨平台的JavaScript运行环境&#xff0c;用于在服务器端执行JavaScript代码。它不是一门新的编程语言&#xff0c;而是基于Google的V8 JavaScript引擎构建的一个平台&#xff0c;允许开发者使用JavaScript编写服务器端应用。Node.js采用了异步…

PolarDB for PostgreSQL-概述

阿里云数据库的概述 本篇罗列了一些知识点和结构。 日志 2. 同步复制&#xff1a;下降20% 异步复制&#xff1a;数据丢失风险&#xff0c; 部署 1.示例&#xff1a; vim polarx.toml 1.测试主库和备库数据一致性 备库是否一致性读 一个节点荡掉&#xff0c;提供服务。 GMS CN…