用于高维数据近似近邻搜索的局部优化产品量化(lopq)训练和部署的python代码。

lopq的Python项目详细描述


#局部优化产品量化

这是用于局部优化产品量化(lopq)模型的python训练和测试代码,以及用于将训练扩展到数亿个向量的spark脚本。所得到的模型可以在Python中使用,这里提供的代码或通过原BoFF格式部署到例如搜索后端,用于高性能近似最近邻搜索。

###概述

局部优化乘积量化(lopq)[1]是一种分层量化算法,它为数据点生成可配置长度的代码。这些代码是对原始向量的有效表示,可以根据应用程序使用各种各样的方法,包括作为保留局部性的散列,作为压缩向量,在该压缩向量中可以重构数据空间中的近似向量,并以此作为计算点之间欧氏距离的近似表示法。

从概念上讲,lopq量化过程可以分为4个阶段。培训过程也按照相同的顺序将这些阶段与数据相匹配。

  1. 原始数据向量是pca'd tod维度(可能是原始维度)。这使得后续量化能够更有效地表示数据中存在的变化。
  2. 然后,pca的数据被两个k均值量化器乘积量化。这意味着每个向量被分成两个子向量,每个子向量的维数都是d/2,并且两个子空间中的每一个子空间都用大小为v的词汇进行独立量化。由于两个量子化独立地发生,所以向量的维度被置换,使得两个子空间中的每一个的总方差近似相等,这使得两个词汇在捕获数据的总方差方面同等重要。这会产生一对集群id,我们称之为“粗码”。
  3. 计算粗量化后数据的残差。然后,对每个粗聚类分别对残差进行局部投影。这个投影是pca和维数置换在残差上的另一个应用,它是“局部”的,因为在两个粗糙词汇中,每个聚类都有不同的投影。这些局部旋转使得下一步也是最后一步,即乘积量化的另一个应用,在捕获残差的方差方面非常有效。
  4. 然后,通过子量化器对局部投影的数据进行最终的乘积量化,从而产生“精细编码”。通常这些子量化器的词汇表都是搜索索引中有效存储的2的幂。对于256大小的词汇表,每个索引向量的精细代码将需要存储在索引中的m字节。

矢量的最终lopq码是一对(粗码,细码)码,例如((3,2),(14,164,83,49,185,29,196,250))

###近邻搜索

<> P>通过将每个文档索引到相应的粗代码桶中,可以从这些Lopq码中构建最近邻索引。也就是说,每对粗码(我们称之为“单元”)将索引量化到该单元的向量桶。

在查询时,传入的查询向量经历基本相同的过程。首先,查询被分割成粗子向量,并计算到每个粗质心的距离。这些距离可用于有效地计算单元的优先级顺序序列[3],使得序列中后面的单元比前面的单元不太可能具有查询的近邻。单元格存储桶中的项目将按此顺序检索,直到满足某些所需的配额。

此检索阶段,采用精细码对近似欧氏距离进行排序。查询被投影到每个局部空间和到每个索引项的距离被估计为查询子向量到由精细码索引的相应子量化器质心的平方距离之和。

基于lopq的神经网络搜索具有很高的可扩展性,在索引存储需求和查询时间延迟方面都有很好的性能。

####参考资料

有关更多信息和性能基准,请访问http://image.ntua.gr/iva/research/lopq/

    1. 卡兰蒂斯,Y.阿维希斯。[局部优化的乘积近似近似最近邻搜索的乘积。](2014)。
    1. Jegou,M.Douze和C.Schmid。[最近邻搜索的乘积量化](https://lear.inrialpes.fr/pubs/2011/JDS11/jegou_searching_with_quantization.pdf)pami,33(1),2011。
    1. 巴本科和莱姆皮茨基。[反向多索引](http://www.computer.org/csdl/trans/tp/preprint/06915715.pdf)CVPR 2012。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
从java包创建可执行jar文件   使用SFDC合作伙伴API创建新的“OpportunityLineItemSchedule”时发生java错误   java如何将一些用户定义的自定义参数直接插入到动态清单中?   java确定JFrame的图形配置?   java 安卓 studio中PendingEvent中的请求代码是什么   java如何在javaFx中为多个场景创建一个菜单栏   java ListNode头。下一个next=新的ListNode(0);这个错误是什么?   javax-to-Google-text-api。网ssl。异常:管道破裂   JAVAlang.ClassCastException:org。冬眠hql。内部的阿斯特。树无法将SqlNode转换为组织。冬眠hql。内部的阿斯特。树FromReferenceNode   jxl中程序关闭时java数据损坏   在java中从arraylist获取对象字段   继承java如何在实现父方法的同时扩展类   java spring boot thin jar什么都不做   java Eclipse消息称列表无法解析为类型   Java中的swing简单动画   java将prejson编码的字符串输出到spring框架   java ExpandableListView。setOnClickListener工作不正常   java将servletinputstream转换为sequenceinputstream   用Java4th版思考(尝试使用NetBeans构建本书的项目,但没有成功)   如何使用java从PostgreSQL数据库中的现有数据库创建新的XML文件