当前位置: 首页 > news >正文

Faiss教程:基础

Faiss对一些基础算法提供了非常高效的实现:k-means、PCA、PQ编解码。

聚类

假设2维tensor x:

ncentroids = 1024
niter = 20
verbose = True
d = x.shape[1]
kmeans = faiss.Kmeans(d, ncentroids, niter, verbose)
kmeans.train(x)

中心点放在kmeans.centroids中,目标函数的值放在kmeans.obj中。返回查询数据最近的中心点:

D, I = kmeans.index.search(x, 1)

返回某个测试数据集中离各个中心点最近的15个点。

index = faiss.IndexFlatL2 (d)
index.add (x)
D, I = index.search (kmeans.centroids, 15)

通过调整索引可以放到GPU上运行。

PCA降维

从40维降低到10维度

# random training data 
mt = np.random.rand(1000, 40).astype('float32')
mat = faiss.PCAMatrix (40, 10)
mat.train(mt)
assert mat.is_trained
tr = mat.apply_py(mt)
# print this to show that the magnitude of tr's columns is decreasing
print (tr ** 2).sum(0)

ProductQuantizer(PQ)

d = 32  # data dimension
cs = 4  # code size (bytes)

# train set 
nt = 10000
xt = np.random.rand(nt, d).astype('float32')

# dataset to encode (could be same as train)
n = 20000
x = np.random.rand(n, d).astype('float32')

pq = faiss.ProductQuantizer(d, cs, 8)
pq.train(xt)

# encode 
codes = pq.compute_codes(x)

# decode
x2 = pq.decode(codes)

# compute reconstruction error
avg_relative_error = ((x - x2)**2).sum() / (x ** 2).sum()

标量量化器(每一维度量化)

d = 32  # data dimension

# train set 
nt = 10000
xt = np.random.rand(nt, d).astype('float32')

# dataset to encode (could be same as train)
n = 20000
x = np.random.rand(n, d).astype('float32')

# QT_8bit allocates 8 bits per dimension (QT_4bit also works)
sq = faiss.ScalarQuantizer(d, faiss.ScalarQuantizer.QT_8bit)
sq.train(xt)

# encode 
codes = sq.compute_codes(x)

# decode
x2 = sq.decode(codes)

# compute reconstruction error
avg_relative_error = ((x - x2)**2).sum() / (x ** 2).sum()

选择索引的策略

推荐使用index_factory,通过参数创建索引。

  • Flat
    提供数据集的基准结果,不压缩向量,也不支持添加id;如果需要 add_with_ids,使用“IDMap,Flat”参数。
    无需训练,支持GPU.

Faiss的索引都是放在RAM中的,所以也就要考虑到内存的占用。

  • HNSWx
    足够的内存,小的数据集。每个向量的links数目x范围[4,64],通过efSearch参数折中速度和精度,每个向量的内存占用为d4+x2*4个字节。
    不支持add_with_ids(如需要添加IDMap),无需训练,不支持从索引中移除向量,不支持GPU

  • xxx,Flat
    xxx表示提前为数据做了聚类,如IVFFlat,通过nprobe这种速度和精度,支持GPU(聚类方法也支持的情况下)。

  • PCARx,...,SQ8
    存储整改向量占用资源太多,可以PCA降到x维度;SQ每项用一个字节表示。这样每个向量只占用x个字节的存储空间。不支持GPU。

  • OPQx_y,...,PQx
    PQx中x是字节数,通常<=64,如果更大采用SQ更为高效。OPQ是对数据做了线性变换更利于数据压缩,y表示:x的倍数、y<=d且y<4*x(推荐)。x表示OPQ中的分割参数,y才是最终切分结果。支持GPU。

从数据集大小的角度(数据量、训练数据大小):

  • 少于1百万,使用...,IVFx,...
    数据集大小为N,x为[4sqrt(N),16sqrt(N)]。使用K-menas进行聚类,我们需要[30x,256x]个向量进行训练(当然越多越好)。支持GPU。

  • 1百万 < N < 1千万,使用...,IMI2x10,...
    IMI在训练数据集中通过kmeans得到2^10个中心点。但它是对向量的前后两半分别进行的聚类,也就是得到的2^10^2=2^20个中心描述。我们需要64*2^10个训练样本。不支持GPU。

  • 1千万 < N < 1个亿,使用...,IMI2x12,...
    同上,只是增加了聚类数。

  • 1亿 < N < 10亿,使用...,IMI2x14,...
    同上。

相关文章:

  • 你的鞋都比你聪明
  • [CF226E]Noble Knight's Path
  • SQL Server内幕之预估与实际执行计划
  • [笔记] 四边形不等式
  • [js] 正则表达式
  • Windows 7安装超级终端连接COM口设备
  • 深入理解Java序列化机制
  • 实现Chrome Devtools调试JavaScript V8引擎
  • ZABBIX(三) zabbix 支持的主要监控方式
  • 算法导论——动态规划
  • 微信公众号支付 当前url未注册
  • 如何监控主从故障是否正常?MySQL数据库
  • Centos7安装greenplum遇到的问题
  • php配置php_pdo_mysql模块
  • Spring Cloud--Honghu Cloud分布式微服务云系统—云架构代码结构构建
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • axios 和 cookie 的那些事
  • leetcode-27. Remove Element
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • overflow: hidden IE7无效
  • PHP 小技巧
  • React-生命周期杂记
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 构建二叉树进行数值数组的去重及优化
  • 浅谈web中前端模板引擎的使用
  • 说说动画卡顿的解决方案
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 一天一个设计模式之JS实现——适配器模式
  • 应用生命周期终极 DevOps 工具包
  • 由插件封装引出的一丢丢思考
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • 通过调用文摘列表API获取文摘
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • # C++之functional库用法整理
  • #《AI中文版》V3 第 1 章 概述
  • #Lua:Lua调用C++生成的DLL库
  • $.ajax中的eval及dataType
  • (0)Nginx 功能特性
  • (层次遍历)104. 二叉树的最大深度
  • (二开)Flink 修改源码拓展 SQL 语法
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (三)uboot源码分析
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (十三)Maven插件解析运行机制
  • (转)Scala的“=”符号简介
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .net知识和学习方法系列(二十一)CLR-枚举
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • [20150321]索引空块的问题.txt
  • [Android]常见的数据传递方式
  • [Arduino学习] ESP8266读取DHT11数字温湿度传感器数据