一、向量化表示的核心概念

1.1 特征空间与向量表示

  • 多维特征表示:通过多个特征维度(如体型、毛发长度、鼻子长短等)描述对象,每个对象对应高维空间中的一个坐标点,来表示狗这个对象,这样可以区分出不同种类的狗狗;如果有些种类难以区分,还可以继续扩充向量的维度。世界万物都可以用这种方法表达。
  • 向量特性
    • 相似对象在特征空间中距离更近
    • 支持向量运算(如:警察-小偷 ≈ 猫-老鼠)
  • 典型应用场景
    • 以图搜图(图片向量化)
    • 视频推荐(视频向量化)
    • 商品推荐(商品向量化)
    • 智能问答(文本向量化)
      image.png

1.2 向量数据库特点

特性传统数据库向量数据库
存储结构数据表向量集合
查询方式精确匹配相似度搜索
查询结果确定值近似最近邻

二、最近邻问题(Nearest Neighbors)

2.1 暴力搜索(Flat Search)

  • 原理:线性扫描所有向量,计算与查询向量的相似度
  • 相似度度量
    • 余弦相似度(向量夹角)
    • 欧氏距离(向量间距)
  • 优缺点
    • ✅ 100%准确率
    • ❌ O(n)时间复杂度
  • 暴力算法:优点是搜索质量是完美的,缺点是耗时;如果数据集小,搜索时间可以接受,那可以用。
- 优化思路:**缩小搜索范围**,比如用【***聚类算法***】(比如k-means),【***哈希算法***】(位置敏感哈希)等,但不能不能保证是最近邻的(除了暴搜能保证,其他都不能保证)

2.2 近似最近邻搜索(ANN)(Approximate Nearest Neighbors)-提速度

2.2.1 基于聚类的方法(以K-Means为例)

  1. 随机生成四个点,作为初始的聚类中心点,然后根据与中心点距离的远近进行分类;
  2. 计算已有分类的平均点,该平均点作为中心点继续分类,然后不断重复,趋于收敛
# K-Means伪代码
1. 随机初始化k个中心点
2. while not converged:a. 将每个向量分配到最近的中心点b. 重新计算每个簇的中心点(均值)
3. 搜索时只需查询最近簇内的向量
  • 优化技巧
    • 增加聚类数量(降低速度)
    • 查询多个最近簇(降低速度)
  • 权衡:搜索质量 vs 搜索速度
    image.png

2.2.2 位置敏感哈希(LSH)(Locality Sensitive Hashing)

核心特性

  1. 高碰撞概率设计
  2. 相似向量更可能哈希到同桶
  • 哈希碰撞:由于输入是固定长度的数据,而输出是固定长度的哈希值,根据鸽巢原理,必然会出现数据不同而哈希值相同的情况,这叫碰撞。
  • 正常而言,哈希算法要尽可能减少碰撞的发生,而(对向量)位置敏感哈希函数-LSH则相反,尽可能让位置相近的数据发生碰撞,然后根据哈希碰撞来进行分组,构建方法:随机划出直线分割平面,两面的点分别增加意味0或1来表示
    image.png
    image.png
    随机超平面哈希实现(随机投影):
  1. 在d维空间中随机生成超平面
  2. 根据向量在超平面哪侧生成bit(1/0)
  3. 组合多个超平面结果生成二进制哈希码
    在这里插入图片描述

分段优化策略:合理地扩充

  • 将哈希码分成m段
  • 只要任意一段匹配即作为候选
  • 显著提高召回率
    image.png

积量化(Product Quantization)-省内存

问题:除了搜索速度,还有内存开销问题

方法——量化(Quantization):降低向量本身大小,但产生码本

聚类算法训练——有损压缩(图片中每个像素点都被其所在分类质心点所替代)——在一定程度保留原始信息——给质心编码,只需存储单个编码值,减少空间(把向量用质心编码表示就是量化)——码本

存在问题——维度灾难:

维度增加(数据稀疏)——需要非常大的聚类数——维度灾难——码本指数级膨胀,超过了量化节约出来的内存,得不偿失
进一步解决:高维分成低维(128->16–子空间需要的聚类数量小2^8)——拼接子向量——笛卡尔积——积量化PQ(Product Quantization)

NSW (Navigable Small World) - 牺牲内存,换取速度和质量

6人理论小世界——导航小世界nsw

需要手动建立图结构

保证以下性质:

需要这个:德劳内三角剖分法

但是这个建立的图结构搜索时候不一定很快速,所以nsw方法如下,
在随机足够放回向量的初始阶段向量点非常的稀疏,很容易在距离较远的点之间建立连接,通过长链接快速导航,再通过短链接精细化搜索
这就是NSW算法的大致工作原理,短连接满足了德劳内三角,长链接帮助快速导航,妙在先粗快,后细慢

HNSW(Hierarchical NSW):分层的导航小世界

搜索时候从最上层进入,快速导航,逐步进入下一层,比 NSW 更可控稳定。缺点就是占用内存太大

三、关键技术对比

方法预处理成本查询速度内存消耗准确性补充说明
暴力搜索100%线性扫描所有向量,保证结果完全准确,但时间复杂度高(O(n)),仅适用于小规模数据集。
K-Means聚类80-95%通过聚类缩小搜索范围,牺牲少量精度换取速度。增加聚类数量可提高准确性,但会降低查询速度。
LSH最快70-90%基于哈希碰撞的近似搜索,适合高维数据。分段策略可提高召回率,但内存开销较大。
NSW85-98%基于图结构的导航小世界,通过长链接快速导航、短链接精细化搜索。预处理成本低于HNSW,但稳定性稍差。
HNSW最快90-99%分层NSW,搜索时从顶层快速导航到底层,精度接近暴力搜索,但内存占用高,适合大规模实时场景和高维向量场景:既解决了高维数据的稀疏性问题,又避免了传统方法因维度增长导致的性能崩塌,成为高维向量搜索的黄金标准
PQ(积量化)75-90%通过子空间量化和笛卡尔积压缩向量,显著节省内存,但需权衡精度损失。适合内存受限的部署场景。

关键总结

  1. 速度优先级:LSH ≈ HNSW > NSW > K-Means > PQ > 暴力搜索
  2. 内存优先级:PQ < 暴力搜索 < NSW < K-Means < HNSW < LSH
  3. 精度优先级:暴力搜索 > HNSW > NSW > K-Means > PQ > LSH

适用场景建议

  • 实时推荐/搜索:HNSW(高精度+高速)
  • 内存敏感型应用:PQ(如移动端、嵌入式设备)
  • 中等规模数据:NSW(平衡速度与内存)
  • 高维数据快速过滤:LSH(如去重、粗筛)
  • 小数据集或验证场景:暴力搜索(确保100%准确率)

四、典型应用场景

  1. 大语言模型

    • 对话历史向量化存储
    • 实现"记忆检索"功能
  2. 推荐系统

    • 用户/商品联合向量空间
    • 实时相似推荐
  3. 多媒体检索

    • 跨模态向量搜索(图→文,文→视频)

以上是整理的笔记,笔记 pdf 下载 --》 【向量数据库与近似最近邻算法】-CSDN文库
速览b站原片!–》 【上集】向量数据库技术鉴赏_哔哩哔哩_bilibili

我的其他文章

RAG调优|AI聊天|知识库问答

  • 你是一名平平无奇的大三生,你投递了简历和上线的项目链接,结果HR真打开链接看!结果还报错登不进去QAQ!【RAG知识库问答系统】新增模型混用提示和报错排查【用户反馈与优化-2025.04.28-CSDN博客
  • 你知不知道像打字机一样的流式输出效果是怎么实现的?AI聊天项目实战经验:流式输出的前后端完整实现!图文解说与源码地址(LangcahinAI,RAG,fastapi,Vue,python,SSE)-CSDN博客
  • 【豆包写的标题…】《震惊!重排序为啥是 RAG 调优杀手锏?大学生实战项目,0 基础也能白嫖学起来》(Langchain-CSDN博客
  • 【Langchain】RAG 优化:提高语义完整性、向量相关性、召回率–从字符分割到语义分块 (SemanticChunker)-CSDN博客
    • 如何让你的RAG-Langchain项目持久化对话历史\保存到数据库中_rag保存成数据库-CSDN博客
  • 分享开源项目oneapi的部分API接口文档【oneapi?你的大模型网关】-CSDN博客

Agent

  • 【MCP】哎只能在cursor中用MCP吗?NONONO!三分钟教你自己造一个MCP客户端!-CSDN博客

docker

  • 【docker0基础教学】手把手教你将你的本地项目进行docker部署-CSDN博客
  • 怎么把我的前后端项目通过docker部署到云服务器【手把手教学】-CSDN博客

前端

  • 面试官:你会怎么做前端web性能优化?我:.%*&.!-CSDN博客
  • CDN是啥?十分钟让Cloudflare免费为你的网站做CDN加速!-CSDN博客

nginx

  • Nginx 反向代理,啥是“反向代理“啊,为啥叫“反向“代理?而不叫“正向”代理?-CSDN博客
  • 关于nginx,负载均衡是什么?它能给我们的业务带来什么?怎么去配置它?-CSDN博客

好用插件

  • 你想不想让你写的博客一键发布多平台?!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/78312.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/78312.shtml
英文地址,请注明出处:http://en.pswp.cn/web/78312.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何用CSS实现HTML元素的旋转效果

原文&#xff1a;如何用CSS实现HTML元素的旋转效果 | w3cschool笔记 &#xff08;本文为科普文章&#xff0c;请勿标记为付费&#xff09; 在网页制作中&#xff0c;为 HTML 元素设置旋转效果可使其更灵动&#xff0c;提升用户体验。本文将深入浅出地介绍如何利用 CSS 实现 H…

Spark集群搭建之Yarn模式

配置集群 1.上传并解压spark-3.1.2-bin-hadoop3.2.tgz&#xff0c;重命名解压之后的目录为spark-yarn。 2. 修改一下spark的环境变量&#xff0c;/etc/profile.d/my_env.sh 。 # spark 环境变量 export SPARK_HOME/opt/module/spark-yarn export PATH$PATH:$SPARK_HOME/bin:$SP…

xLua笔记

Generate Code干了什么 肉眼可见的&#xff0c;在Asset文件夹生成了XLua/Gen文件夹&#xff0c;里面有一些脚本。然后对加了[CSharpCallLua]的变量寻找引用&#xff0c;发现它被XLua/Gen/DelegatesGensBridge引用了。也可以在这里查哪些类型加了[CSharpCallLua]。 public over…

【tcp连接windows redis】

tcp连接windows redis 修改redis.conf 修改redis.conf bind * -::*表示禁用保护模式&#xff0c;允许外部网络连接 protected-mode no

【序列贪心】摆动序列 / 最长递增子序列 / 递增的三元子序列 / 最长连续递增序列

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;贪心算法 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 摆动序列最长递增子序列递增的三元子序列最长连续递增序列 摆动序列 摆动序列 贪心策略&#xff1a;统计出所有的极大值和极小…

STM32F103C8T6使用MLX90614模块

首先说明&#xff1a; 1.SMBus和I2C的区别 我曾尝试用江科大的I2C底层去直接读取该模块&#xff0c;但是无法成功&#xff0c;之后AI生成的的代码也无法成功。 思来想去最大的可能就是SMBus这个协议的问题&#xff0c;根据百度得到的结果如下&#xff1a; SMBus和I2C的区别 链…

tp5 php获取农历年月日干支甲午

# 切换为国内镜像源 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/# 再次尝试安装 composer require overtrue/chinese-calendar核心写法一个农历转公历&#xff0c;一个公历转农历 农历闰月可能被错误标记&#xff08;例如 闰四月 应表示…

Ubuntu搭建Conda+Python开发环境

目录 一、环境说明 1、测试环境为ubuntu24.04.1 2、更新系统环境 3、安装wget工具 4、下载miniconda安装脚本 二、安装步骤 1、安装miniconda 2、source conda 3、验证版本 4、配置pip源 三、conda用法 1、常用指令 一、环境说明 1、测试环境为ubuntu24.04.1 2、更…

Vscode+git笔记

1.U是untracked m是modify modified修改了的。 2.check out 查看观察 3 status changed 暂存区 4.fetch v 取来拿来 5.orangion 起源代表远程分支 git checkout就是可以理解为进入的意思。

模拟SIP终端向Freeswitch注册用户

1、简介 使用go语言编写一个程序&#xff0c;模拟SIP-T58终端在Freeswitch上注册用户 2、思路 以客户端向服务端Freeswitch发起REGISTER请求&#xff0c;告知服务器当前的联系地址构造SIP REGISTER请求 创建UDP连接&#xff0c;连接到Freeswitch的5060端口发送初始的REGISTER请…

DeepSeek实战--LLM微调

1.为什么是微调 &#xff1f; 微调LLM&#xff08;Fine-tuning Large Language Models&#xff09; 是指基于预训练好的大型语言模型&#xff08;如GPT、LLaMA、PaLM等&#xff09;&#xff0c;通过特定领域或任务的数据进一步训练&#xff0c;使其适应具体需求的过程。它是将…

Docker与WSL2如何清理

文章目录 Docker与WSL2如何清理一、docker占据磁盘空间核心原因分析1. WSL2 虚拟磁盘的动态扩展特性2. Docker 镜像分层缓存与未清理资源 二、解决方案步骤 1&#xff1a;清理 Docker 未使用的资源步骤 2&#xff1a;手动压缩 WSL2 虚拟磁盘1. 关闭 WSL2 和 Docker Desktop2. 定…

在 IDEA 中写 Spark 程序:从入门到实践

在大数据处理领域&#xff0c;Apache Spark 凭借其出色的性能和丰富的功能受到广泛欢迎。而 IntelliJ IDEA 作为一款功能强大的 Java 集成开发环境&#xff0c;为编写 Spark 程序提供了极大的便利。本文将详细介绍如何在 IDEA 中搭建 Spark 开发环境并编写运行 Spark 程序&…

Unity 使用 ADB 实时查看手机运行性能

Unity 使用 ADB 实时查看手机运行性能 前言操作步骤ADB工具下载ADB工具配置手机进入开发者模式并开启USB调试使用ADB连接手机Unity打包设置使用Profiler实时查看性能情况优化建议 常见问题 前言 通过 ADB&#xff08;Android Debug Bridge&#xff09;连接安卓设备&#xff0c…

深入理解 HttpExchange_Java 中构建 HTTP 服务的基础组件

1. 引言 1.1 Java 中的轻量级 HTTP 服务需求 随着微服务、工具类应用和嵌入式系统的兴起,开发者对轻量级 HTTP 服务的需求日益增长。相比引入庞大的框架(如 Spring Boot),使用 JDK 原生 API 构建 HTTP 服务成为一种快速、低依赖的替代方案。 JDK 提供了 com.sun.net.htt…

【RocketMQ NameServer】- NameServer 启动源码

文章目录 1. 前言2. RocketMQ 通信架构3. NameServer 启动流程3.1 创建 NameServerController3.2 启动 NameServerController3.3 NamesrvController#initialize3.3.1 Netty 通信的整体流程3.3.2 创建 NettyRemotingServer 3.4 this.remotingServer.start()3.4.1 this.remotingS…

【算法题】荷兰国旗问题[力扣75题颜色分类] - JAVA

一、题目 二、文字解释 1.1 前言 本题是经典的「荷兰国旗问题」&#xff0c;由计算机科学家 Edsger W. Dijkstra 首先提出。如同图中所示的荷兰国旗&#xff0c;其由红、白、蓝三色水平排列组成。在算法领域&#xff0c;该问题可类比为将一个由特定的三种元素&#xff08;可抽…

MySQL数据操作全攻略:DML增删改与DQL高级查询实战指南

知识点4【MySQL的DDL】 DDL&#xff1a;主要管理数据库、表、列等操作。 库→表&#xff08;二维&#xff09;→列&#xff08;一维&#xff09; 数据表的第一行是 列名称 数据库是由一张或多张表组成 我们先学习在数据库中创建数据表 0、常见的数据类型&#xff1a; 1、…

AtCoder AT_abc404_g [ABC404G] Specified Range Sums

前言 赛时想到了差分约束&#xff0c;随手写了个 SPFA 结果挂的很惨……还是太菜了&#xff0c;赛后 Bellman-Ford 又调了半天。 题目大意 给定整数 N , M N,M N,M 和长度为 M M M 的三个整数序列 L ( L 1 , L 2 , … , L M ) , R ( R 1 , R 2 , … , R M ) , S ( S 1…

如何基于HAL库进行STM32开发

一、初识HAL库 STM32 开发中常说的 HAL 库开发&#xff0c;指的是利用 HAL 库固件包里封装好的 C 语言编写的驱动文件&#xff0c;来实现对 STM32 内部和外围设备的控制。但只有 HAL 库还不能直接驱动一个 STM32 的芯片&#xff0c;其它的组件已经由 ARM 与众多芯片硬件、软件厂…