向量数据库中的PQ(Procduct Quantization)

为了加快向量之间距离计算和比较速度,有人发明的Product Quantization方法,这个方法并不是一种索引,所以它并不能减少目标向量(要查找的向量),与数据库中向量的比较次数,但是它可以加快与每个数据库中向量比较时的计算量。

这个方法分为两部分,

第一部分是量化,其思想如下:

a)把一个维度很高的向量切分成好几个段,例如,128维度,切分成4段每段32维度的小向量,怎么切分呢?其实没啥高深复杂的,就是简单的从左到右直接切分(至于网上论文中所说的什么笛卡尔积、向量乘法之类唬人的名词,根本就不是这么回事,当然也不排除可能有更合适的切分方法)

b) 向量数据库中的所有向量,切分后的第一个段(32维度的向量),都取出来,做kmeans,计算它们的中心点,至于这些向量要分成几个区域,就由量化设计者决定了,例如,我决定分为256个区域,那么向量数据库中所有向量都拿出第一个段(32维度的向量),做kmeans,计算出256个中心点后,然后再把所有向量的第一段,分配给这256个区域,怎么分呢?分配到与它距离最近的个中心点,并且,我们给每个中心点一个编号(ID),每个库向量的第一个段,分配到某个中心点后,就用这个中心点的ID表示这个段的32维度的向量,这里的分配并不是归类存储,而是计算每个库向量的第一个段,应由哪个中心点的ID代表。这个信息要记下来。

然后所有库向量取出第二个段,也是用kmeans算法得到256个中心点,并编号,然后每个库向量的第二个段,用与它最近的中心点的ID代替。

然后所有库向量取出第三个段,用kmeans算法得到256个中心点,编号,然后每个库向量的第三个段,用与它最近的中心点的ID代替。

然后所有向量库取出第四个段,用kmeans算法得到256个中心点,编号,然后每个库向量的第四个段,用与它最近的中心点的ID代替。

这样对于向量数据库中的每个128维向量,都可以用4个ID组成的数组代替了,由于这些ID的编号是0-255,因此每个ID只用一个byte就可以表示,可以把这4个ID组成的数组,也看成是一个向量,只有4维并且每个维度8bit,当然这个4维的向量需要一个参照,就是每个段的256个中心点。

有了每个段的256个中心点这个参照,就可以可以把数据库中的每个128维向量,按照上面的方法,转化成4个ID组成的数组,这4个ID组成的数组就可以近似的代替这个128维的向量,这个4维数组,就是128维向量“量化”后的结果。

这4段每段256个中心点就是一个“码表”(这个定义尚未统一,有人觉得码表也包括所有量化后的向量)

总之,经过上面的“量化”,得到了每段的中心点和所有原始向量量化后的向量,它们共同组成的信息库,后面就可以用来快速比较了。

第二部分是比较

有了前面的量化后的数据:每段的中心点和(数据库中)每个向量的量化表示。当有目标向量到来,想要和库中的所有向量比较,找到最近的前K个时,这个比较方法是怎样的呢?

a)首先目标向量也要分段,按照其它向量的方式分,例如,128维的目标向量分为4段,每段是一个32维的向量。

b)数据库中存储着每个段的256个中心点,目标向量的每个段,要计算这个32维向量与每个中心点的距离,即每个段会得到256个距离,这些距离要保存下来。对于本例,一共需要计算4x256个距离。

c)前一步其实完成了目标向量的量化和码表计算,它的码表就是这4x256个距离,这些距离可以放到二维数组里,对于每个段,每个距离都有一个编号,这个编号和其对应中心点的编号相同,如下图:

d)然后就要比较了,比较时,对于一个量化后的库向量,它由4个ID组成,对于目标向量,之前已经计算好每个段的32维向量与各自段中256个中心点的距离,并且距离的编号与数据库码表中心点的编号一一对应,因此,假设取出一个库向量的第一个ID,在目标向量的距离码表的第一段中查出一个距离d1,这就是目标向量与库向量的距离在第一段中的距离(这只是两个向量总的距离指标的一个分量),然后取库向量的第二个ID,在目标向量的距离码表的第二段中查出一个距离d2,这是第二段的距离,然后再查出第三段距离d3、第四段的距离d4,最后,把d1+d2+d3+d4的和作为整个目标向量与这个库向量的距离指标。计算一个目标向量与一个库向量距离的过程,只要4次查表和3次加法,要比如实的计算两个128维向量的距离要快的多。

当然对于每个目标向量,都要有个建立距离表的过程,但是这只需要建立一次,就可以用于多次与库向量的距离计算。

参考

【Faiss】PQ和IVF介绍_ivf算法-CSDN博客

理解 product quantization 算法

https://zhuanlan.zhihu.com/p/560981386

图像检索:再叙ANN Search

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(第三十三天)

1. 设置主从从 mysql57 服务器 ( 1 )配置主数据库 [rootmsater_5 ~] # systemctl stop filewalld [rootmsater_5 ~] # setenforce 0 [rootmsater_5 ~] # systemctl disable filewalld [rootmsater_5 ~] # ls anaconda-ks.cfg mysql-5.7.44-linux-g…

uniapp 页面跳转传参:父页面监听子页面传过来的数据

父页面 监听events事件 uni.navigateTo({url: "/components/watermark-camera",events: { // 重点重点重点重点重点重点重点重点getImages(data) { // 接收子页面抛出的 getImages 事件console.log("水印相机的照片:", data)}}})子页面 const …

<数据集>航拍牧场奶牛识别数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:1805张 标注数量(xml文件个数):1805 标注数量(txt文件个数):1805 标注类别数:1 标注类别名称:[cow] 序号类别名称图片数框数1cow1805141337 使用标注工具&#xff…

World of Warcraft [CLASSIC] the Eye of Eternity [EOE] P1-P2

World of Warcraft [CLASSIC] the Eye of Eternity [EOE] 永恒之眼(蓝龙) 第一阶段 第二阶段 第三阶段 载具1-6技能介绍 World of Warcraft [CLASSIC] the Eye of Eternity [EOE]_永恒之眼 eoe-CSDN博客 永恒之眼怎么出副本呢,战斗结束&am…

makefile文件基本语法

一、makefile文件基本介绍 Makefile 文件是 make 工具使用的配置文件,它定义了如何自动化构建项目的规则和命令。Makefile 文件的主要作用是指定如何编译和链接程序,以及管理文件之间的依赖关系,从而实现高效的构建过程。 1.1 Makefile 的基…

uniapp微信小程序 分享功能

uniapp https://zh.uniapp.dcloud.io/api/plugins/share.html#onshareappmessage export default {onShareAppMessage(res) {if (res.from button) {// 来自页面内分享按钮console.log(res.target)}return {title: 自定义分享标题,path: /pages/test/test?id123}} }需要再真机…

Appium定位元素

使用工具: 报错: Error while obtaining UI hierarchy XML file: com.android.ddmlib.SyncException: Remote object doesn‘t 参考链接:Error while obtaining UI hierarchy XML file: com.android.ddmlib.SyncException: Remote object doesn‘t-CSD…

Centos安装Jenkins教程详解版(JDK8+Jenkins2.346.1)

本教程基于 JDK8 和 Jenkins2.346.1 JDK安装 下载OpenJDK8文件 wget https://mirrors.tuna.tsinghua.edu.cn/Adoptium/8/jdk/x64/linux/OpenJDK8U-jdk_x64_linux_hotspot_8u422b05.tar.gz解压到指定目录 # 创建目录 mkdir -p /usr/local/software# 解压文件到指定目录&#…

Eclipse部署一个项目到Tomcat和部署多个项目到Tomcat

Eclipse部署一个项目到Tomcat: https://blog.csdn.net/weixin_42334396/article/details/105902994 Eclipse部署多个项目到Tomcat: https://blog.csdn.net/zhanglin1220/article/details/82056185 使用cmd方法强制关闭端口,解除端口占用方法&…

多元统计分析——基于R语言的单车使用情况可视化分析

注:基于R语言的单车使用情况可视化分析为实验记录,存在不足,自行改进。 一、提出问题(要解决或分析的问题) 1 、用户对共享单车的使用习惯,环境对共享单车运营带来的影响? 2 、共享单车的租赁…

stripe Element 如何使用

这里要准备好几个东西: 一个支付成功过后的回调 还有一个下单的接口 一旦进入这个下单界面,就要去调下单的接口的,用 post, 这个 接口你自己写,可以写在后端中,也可以放到 nextjs 的 api 中。 首先说的是这个下单…

聚星文社——绘唐科技Ai推文软件

聚星文社——绘唐科技Ai推文软件 聚星文社--绘唐科技Ai推文软件https://iimenvrieak.feishu.cn/docx/ZhRNdEWT6oGdCwxdhOPcdds7nof AI推文软件是一种利用人工智能技术帮助用户自动生成推文内容的工具。 该软件会分析用户提供的相关信息和目标群体, 然后使用机器学习…

闲置物品交易平台网站商城-计算机毕设Java|springboot实战项目

🎓 作者:计算机毕设小月哥 | 软件开发专家 🖥️ 简介:8年计算机软件程序开发经验。精通Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等技术栈。 🛠️ 专业服务 🛠️ 需求定制化开发源码提…

【运维高级内容--MySQL】

目录 一、mysql安装 二、MySQL主从复制 一、mysql安装 yum install cmake gcc-c openssl-devel ncurses-devel.x86_64 rpcgen.x86_64 #安装依赖性 #在root路径下下载mysql-boost-5.7.44、libtirpc-devel-1.3.3-8.el9_4.x86_64.rpm安装包 yum install libtirpc-devel…

MFC之word操作

MFC对word操作 背景说明 当对程序的内容进行输出时,比如自定义对象属性描述或者注释(详细设计)生成文档时,如果采用手动输入会比较麻烦,并且当程序变动时,需要再一次修改对应文档,作为程序员做…

ASP.NET Core 入门教程一 创建最小 API

构建最小 API,以创建具有最小依赖项的 HTTP API。 它们非常适合需要在 ASP.NET Core 中仅包括最少文件、功能和依赖项的微服务和应用。 本教程介绍使用 ASP.NET Core 生成最小 API 的基础知识。 启动 Visual Studio 2022 并选择“创建新项目”。 在“创建新项目”…

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——6.vector(模拟实现)

1.存储结构 namespace zone {template<class T> //需要模板class vector{public:private:iterator _start;iterator _finish;iterator _endofstorage;}; } 可见&#xff0c;vector内核是由三个指针实现的 2.默认成员函数 2.1.构造函数 1.初始化列表 vector() :_star…

linux 磁盘满了,程序运行失败,如何处理?df -h

场景&#xff1a;紧急呼救&#xff0c;上传图片失败了。我一脸懵&#xff0c;服务器这是又咋地了&#xff0c;别邪乎姐姐&#xff0c;姐姐胆子小啊。 一、寻找问题原因 1、OSS出问题了&#xff1f; 然后我尝试了 IOS 的APP是没问题的&#xff0c;Android提示上传失败&#xf…

IIS发布打包后文件

1.打开IIS软件 2 添加网站&#xff0c; 自定义网站名称-选择要放置的资源路径-选择IP地址 3.打开放置的资源目录放置打包后文件 4.选择浏览 搜索不到IIS可进行一下操作 控制面板-程序和功能-启用或关闭windows功能-勾选IIS

Linux之数字证书

新书速览|Ubuntu Linux运维从零开始学_ubuntu linux运维从零开始学 pdf 下载-CSDN博客 《Ubuntu Linux运维从零开始学&#xff08;Linux技术丛书&#xff09;》(肖志健)【摘要 书评 试读】- 京东图书 (jd.com) 随着网络环境的恶化&#xff0c;人们已经逐渐抛弃网络上面的明文…