用于高维数据近似近邻搜索的局部优化产品量化(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 Hibernate会话。save()不返回值吗?   java JMS应用程序发布订阅   java使用字符串创建一个长度为n,高度为n的正方形   java如何在MySQL的SQL查询中传递ArrayList<>如IN子句   安卓 java。lang.IllegalArgumentException:指定为非null的参数为null:方法kotlin。jvm。内部的内在的。检查参数不完整   如何用Java绘制交互式图形/线条?   java Blackberry移动Web应用快捷方式   java Json LocalDateTIme问题   java更改密钥的颜色   java在过滤条件之后在流上迭代时如何获取上一个对象   Java:按位和创建无符号字节   java在JavaScript中检索Velocity循环变量   java JButton不会出现在GUI上   java Cell API json转换到POJO   java在模拟中初始化静态最终变量