faiss python安装_faiss入门

Faiss入门篇假定Faiss已经被安装,若未安装可参考小编安装编译篇https://zhuanlan.zhihu.com/p/78689463。本篇小编基于Faiss的官方wiki实例展开,旨在让大家快速入门Faiss。Faiss底层用c++实现并为用户提供python接口,本篇我们以python示例Faiss用法,使用python接口前,需要下载numpy包用于faiss向量加载。

Faiss处理大规模d维向量近邻检索的问题,Faiss中所有向量以行矩阵的形式储存和使用,实例中我们用xb表示所有待索引的向量集合 ,xq表示查询向量集合,nb和nq分别表示xb、xq集合中向量数量。

构建待检索向量和查询向量

import numpy as np
d = 64
# 向量维度
nb = 100000
# 待索引向量size
nq = 10000
# 查询向量size
np.random.seed(1234)
# 随机种子确定
xb = np.random.random((nb, d)).astype('float32')
xb[:, 0] += np.arange(nb) / 1000.
#为了使随机产生的向量有较大区别进行人工调整向量
xq = np.random.random((nq, d)).astype('float32')
xq[:, 0] += np.arange(nq) / 1000.

建立索引并添加向量

Faiss通过Index对象进行向量的封装与预处理,Faiss提供了很多种索引类型,我们首先test暴力搜索精准L2距离搜索,对应的索引对象为IndexFlatL2。

所有向量在建立前需要明确向量的维度d,大多数的索引还需要训练阶段来分析向量的分布。但是,对于L2暴力搜索来说没有训练的必要。

Index对象训练好之后,对于Index有两个操作供调用,分别为add和search。add方法用于向Index中添加xb向量,search方法用于在add向量后的索引中检索xq的若干近邻。Index还有两个状态变量is_trained(bool类型,用于指示index是否已被训练)和ntotal(指示索引的数量)。此外,index还有IDs添加的方法。

import faiss
index = faiss.IndexFlatL2(d)
# 建立索引
print(index.is_trained)        
# 输出true
index.add(xb)
# 索引中添加向量
print(index.ntotal)            
# 输出100000

近邻搜索

通过Index检索xq中的数据,faiss支持批量数据检索,通过search方法返回的检索结果包括两个矩阵,分别为近邻向量的索引序号和xq中元素与近邻的距离大小。

k = 4
# 返回每个查询向量的近邻个数
D, I = index.search(xb[:5], k)
# 检索check
print(I)
print(D)
D, I = index.search(xq, k)
#xq检索结果
print(I[:5])
# 前五个检索结果展示
print(I[-5:])
# 最后五个检索结果展示

检索结果

check检索结果

[[ 0 393 363 78]

[ 1 555 277 364]

[ 2 304 101 13]

[ 3 173 18 182]

[ 4 288 370 531]]

[[ 0. 7.17517328 7.2076292 7.25116253]

[ 0. 6.32356453 6.6845808 6.79994535]

[ 0. 5.79640865 6.39173603 7.28151226]

[ 0. 7.27790546 7.52798653 7.66284657]

[ 0. 6.76380348 7.29512024 7.36881447]]

xq检索结果

[[ 381 207 210 477]

[ 526 911 142 72]

[ 838 527 1290 425]

[ 196 184 164 359]

[ 526 377 120 425]]

[[ 9900 10500 9309 9831]

[11055 10895 10812 11321]

[11353 11103 10164 9787]

[10571 10664 10632 9638]

[ 9628 9554 10036 9582]]

上面所示,IndexFlatL2是暴力检索的索引,为了加速检索speed,可以使用faiss的IndexIVFFlat索引对象。IndexIVFFlat的使用需要进行训练阶段,并需要指定其他索引作为量化器,与检索相关的参数

为nlist和nprobe。IndexIVFFlat索引先利用粗量化器将检索向量划分到Voronoi单元中并建立倒排索引,检索阶段将根据输入向量和probe参数定位到对应的Voronoi cell中进行近邻搜素。

IndexIVFFlat检索

nlist = 100
k = 4
quantizer = faiss.IndexFlatL2(d)
# 量化器索引
index = faiss.IndexIVFFlat(quantizer, d, nlist, faiss.METRIC_L2)
# 指定用L2距离进行搜索,若不指定默认为內积
assert not index.is_trained
index.train(xb)   
# 索引训练
assert index.is_trained
index.add(xb)
# 向量添加
D, I = index.search(xq, k)
# 检索
print(I[-5:])
# 最后五个检索结果
index.nprobe = 10
# 多探针检索
D, I = index.search(xq, k)
print(I[-5:])
#最后五个检索结果

检索结果显示

1probe

[[ 9900 10500 9831 10808]

[11055 10812 11321 10260]

[11353 10164 10719 11013]

[10571 10203 10793 10952]

[ 9582 10304 9622 9229]]

10probe

[[ 9900 10500 9309 9831]

[11055 10895 10812 11321]

[11353 11103 10164 9787]

[10571 10664 10632 9638]

[ 9628 9554 10036 9582]]

读者可自行观察测试各参数对检索结果的影响。

本篇代码可以在faiss中的 tutorial/ 目录下查找。

Reference

https://github.com/facebookresearch/faiss/wiki

本篇内容在本人个人公众号上也已发布,欢迎关注本人微信公众号“勤菜鸟”。

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

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

相关文章

MySQL 索引底层数据结构实现

文章目录概述讨论范围查询数据结构查询数据结构种类及其高性能查询原理MySQL 索引的底层数据结构MySQL 索引的需求分析选择 MySQL 索引的底层数据结构B- 树和 B 树的对比MySQL 索引的底层数据结构揭秘概述 MySQL 的索引是存储引擎用于快速找到记录的一种数据结构,是…

Java面试——SpringMVC系列总结

文章目录: 1.什么是Spring MVC? 2.Spring MVC的主要组件有哪些? 3.请描述一下Spring MVC的工作流程? 4.MVC是什么?MVC设计模式的好处有哪些 5.拦截器Interceptor与过滤器Filter有什么区别? 6.Spring …

中蒙俄经济走廊背景_上海外国语大学师生代表团参观访问G60科创走廊俄罗斯院士创新基地...

10月23日,上海外国语大学团委书记、创新创业与实践教育学院执行院长廖文其、俄罗斯东欧中亚学院党总支副书记郝佳、辅导员石朝天及学生代表等一行15人参观访问G60科创走廊俄罗斯院士创新基地(下简称:创新基地)。创新基地主任赵磊、俄罗斯中小企业联合会华…

MySQL 索引类别与索引使用指南

文章目录概述MySQL 索引类型MySQL 索引方法BTREE 方法HASH 方法主键构成的索引结构主键索引的优点主键索引的缺点依赖顺序插入更新代价高索引使用指南索引树回顾索引树排序规则最左前缀法则最左前缀法则的产生依据最左前缀法则延申字段书写顺序不影响最左前缀法则最左前缀法则总…

测试员不可不知的几款bug管理工具

根据每个公司性质的不同,规模的不同,所用到的bug管理工具也可能不同。你们用的bug管理工具是什么呢?下面介绍几款主流的bug管理工具: 1. JIRA(付费) JIRA的生产者把JIRA定义为Professional Issue Tracker&…

ios 监听一个控制器的属性_ios - kvo观察者示例(监听类的属性变化)

首先创建Person分类#import interface Person : NSObjectproperty (nonatomic, copy) NSString *name;property (nonatomic, assign) float height;end.m中不做任何事情控制器.m中#import "ViewController.h"#import "Person.h"interface ViewController (…

Bugzilla 使用指南

本篇文章主要关注于如何高效合理的使用Bugzilla。 Bugzilla是一个开源的缺陷跟踪系统,它可以管理软件开发过程中缺陷的提交、修复、关闭等整个生命周期。 1. 基本概念 在Bugzilla中,Bug报告状态分为以下几种状态, 待确认的 unconfirmed 新…

MySQL explain 命令

概述 MySQL 的 explain 命令,主要用于查看实际查询过程中的一些执行细节(执行计划),也是查看优化器决定如何执行查询的主要方法 explain 使用示例 explain 的使用也很简单,在 select 语句之前增加 explain 关键字再…

r语言从giuthb安装失败_R语言install_github安装包问题

今早在看微信时,看到一篇文章介绍R可视化的数据包 - rCharts。rCharts的可用性还OK,就是安装时遇到很多坑。如果想要玩一下rCharts,希望我说的这些坑可以让你更快的完成安装。首先需要安装devtools的包,devtools包安装时&#xff…

centos6.5安装bugzilla超详细教程

经过自己的摸索,与尝试,成功在centos6.5上,安装bugzilla。并且可以发送邮件。 一、安装软件 首先,需要安装一些软件 yum install mysql-devel -y yum install mysql-server -y yum install httpd -y yum install gcc gcc-…

从numpy里加载_PyTorch强化:01.PyTorch 数据加载和处理

PyTorch提供了许多工具来简化和希望数据加载,使代码更具可读性。1.下载安装包scikit-image:用于图像的IO和变换pandas:用于更容易地进行csv解析from __future__ import print_function, divisionimport osimport torchimport pandas as pd #用…

Redmine使用手册

一、Redmine简介 Redmine是基于ROR框架开发的一套跨平台项目管理系统,是项目管理系统的后起之秀,据说是源于Basecamp的ror版而来,支持多种数据库,除了和DotProject的功能大致相当外,还有不少自己独特的功能&#xff0…

swagger2maven依赖_Maven + SpringMVC项目集成Swagger

Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。作用&#x…

IDEA2019版最新配置SVN及上传教程-超详细图文详解

IDEA2019版配置SVN图文详解 1. 查看svn仓库 调出svn视图: 连接svn服务器: 连接后效果如下: 补充:如果输入正确的连接地址后出现错误—系统找不到指定的文件 请到设置中检查(File | Settings | Version Control | Subversion)SVC客户端路径…

openocd目录_OpenOCD的调试

Openocd的调试步骤1、前言本文档仅用于学习参考。对本文档作者保留所有权利。联系邮箱:yarakyoungqq.com2、工具本文使用的软、硬件工具如下:目标开发板:ST SPEAr310 EVB 2.0(官网www.st.com)及其交叉编译环境。仿真器:OpenJTAG(官…

dubbo:reference、dubbo:service和@Service、@Reference使用情况

以前在同一模块中Spring依赖注入&#xff0c;可以通过Service和Autowired Dubbo是远程服务调用&#xff0c;消费方需要注入提供方定义的接口实例&#xff0c;可以通过xml配置 dubbo:reference、dubbo:service <dubbo:service interface"fei.CustomerServices" …

SSM+Maven+Dubbo+Zookeeper简单项目实战以及易错注意点

最近为了熟悉Dubbo远程过程调用架构的使用&#xff0c;并结合SSMMaven整合了简单的一套项目实战 直接看项目结构图 各模块介绍 dubbo-common&#xff1a;存放项目需要的公众类&#xff0c;像查询模型、数据库实体模型等 dubbo-config&#xff1a;存放项目所需的公众配置文件&…

c++二叉树的层序遍历_leetcode 103. 二叉树的锯齿形层序遍历

按层次遍历&#xff0c;记录下对应节点的val和所在层&#xff0c;然后经过一定变换得到输出。python代码如下&#xff1a;# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, x):# self.val x# self.left None# …

TCP和UDP的区别(Socket)

TCP和UDP区别 TCP和UDP编程区别 TCP编程的服务器端一般步骤是&#xff1a;   1、创建一个socket&#xff0c;用函数socket()&#xff1b;   2、设置socket属性&#xff0c;用函数setsockopt(); * 可选   3、绑定IP地址、端口等信息到socket上&#xff0c;用函数bind(); …

mysql out_mysql存储过程 in out inout

存储过程的好处存储过程是一组预编译好的sql语句&#xff0c;用来执行某个特定的功能。这样可以省去sql解析、编译、优化的过程&#xff0c;提高了执行效率&#xff0c;同时&#xff0c;在调用的时候只传一个存储过程的名称&#xff0c;而不用传一大堆sql语句&#xff0c;减少了…