dtcms 模板下载 IntelliJ IDEA 端口映射 Eclipse插件 二叉树排序 golang image winforms date matlab向上取整 phpmyadmin permissions NEC 后台管理系统模板 less用法 oracle无效的列索引 jquery关闭当前窗口 安卓虚拟机运行windows flutter 缺点 jquery validate python线程 python库 random函数用法 java入门 java字符串反转 配置java环境 java编程语言 java查看变量类型 kafka中文教程 销售清单打印软件 离散数学pdf 地球末日攻略 2k14生涯模式修改器 快打旋风3出招表 robotstudio 为什么英雄联盟无法连接服务器 怎么设置迅雷为默认下载器 自动答题软件 deepcopy 流媒体下载
当前位置: 首页 > 学习教程  > 编程语言

Faiss的第二个示例 IVFFlat

2020/8/11 19:50:15 文章标签:

Faiss的第二个示例 IVFFlat

import mkl
mkl.get_max_threads()
import numpy as np

d = 64 # dimension
nb = 100000 # database size
nq = 10000 # nb of queries
np.random.seed(1234) # make reproducible
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.

import faiss

nlist = 100
k = 4
quantizer = faiss.IndexFlatL2(d) # the other index
index = faiss.IndexIVFFlat(quantizer, d, nlist, faiss.METRIC_L2)

here we specify METRIC_L2, by default it performs inner-product search

assert not index.is_trained
index.train(xb)
assert index.is_trained

index.add(xb) # add may be a bit slower as well
D, I = index.search(xq, k) # actual search
print(I[-5:]) # neighbors of the 5 last queries
index.nprobe = 10 # default nprobe is 1, try a few more
D, I = index.search(xq, k)
print(I[-5:]) # neighbors of the 5 last queries

输出结果是

[[ 9900 9309 9810 10048]
[11055 10895 10812 11321]
[11353 10164 9787 10719]
[10571 10664 10632 10203]
[ 9628 9554 9582 10304]]
[[ 9900 10500 9309 9831]
[11055 10895 10812 11321]
[11353 11103 10164 9787]
[10571 10664 10632 9638]
[ 9628 9554 10036 9582]]

为了加快搜索速度,可以将数据集分段。我们在d维空间中定义Voronoi单元,并且每个数据库向量都落入其中一个单元中。在搜索时,仅包含在查询x所在的单元格中的数据库向量y,并且将几个相邻的数据库向量与查询向量进行比较。

这是通过IndexIVFFlat索引完成的。这种类型的索引需要训练阶段,该训练阶段可以对与数据库向量具有相同分布的任何向量集合执行。在本例中,我们只使用数据库向量本身。

IndexIVFFlat还需要另一个索引,即量化器,它将向量分配给Voronoi单元格。每个单元由一个质心定义,找到一个向量所在的Voronoi单元就是在质心集合中找到该向量的最近邻居。这是另一个索引的任务,通常是IndexFlatL2。

搜索方法有两个参数:nlist和nProbe,nList是单元的数量,nProbe是为执行搜索而访问的单元的数量(在nList之外)。由于量化,搜索时间大致随着探针数量加上某个常数而线性增加。

IndexIVFFlat这个模式就是Inverted file with exact post-verification

IndexIVFFlat 的Method是 Inverted file with exact post-verification 。它的index_factory是 “IVFx,Flat”
带有倒排索引的文件我们称为倒排索引文件,简称倒排文件(inverted file)。
倒排索引的解释,引用知乎: 渣翻译的例子之一。英文原名Inverted index,大概因为 Invert 有颠倒的意思,就被翻译成了倒排。但是倒排这个名称很容易让人理解为从A-Z颠倒成Z-A。个人认为翻译成转置索引可能比较合适。一个未经处理的数据库中,一般是以文档ID作为索引,以文档内容作为记录。而Inverted index 指的是将单词或记录作为索引,将文档ID作为记录,这样便可以方便地通过单词或记录查找到其所在的文档。
假设我们有两个文档,每个文档的 content 域包含如下内容:

Doc_1:The quick brown fox jumped over the lazy dog
Doc_2:Quick brown foxes leap over lazy dogs in summer

为了创建倒排索引,我们首先将每个文档的 content 域拆分成单独的 词(我们称它为 词条 或 tokens ),创建一个包含所有不重复词条的排序列表,然后列出每个词条出现在哪个文档。结果如下所示:
在这里插入图片描述


本文链接: http://www.dtmao.cc/news_show_100213.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?