【向量数据库】用披萨点餐解释向量数据库:一个美味的技术类比

文章目录

  • 前言
  • 场景设定:披萨特征向量化
  • 顾客到来:生成查询向量
  • 相似度计算实战
    • 1. 欧氏距离计算(值越小越相似)
    • 2. 余弦相似度计算(值越大越相似)
  • 关键发现:度量选择影响结果
  • 现实启示
  • 结语


前言

想象你走进一家数字化的披萨餐厅,这里用AI技术优化了点餐流程。让我们通过这个生动场景来解释向量数据库的核心概念。

场景设定:披萨特征向量化

这家餐厅把每种披萨用3个特征表示(实际应用中可能有几百维):

  • 咸度(0-10)
  • 芝士量(0-10)
  • 辣度(0-10)

现有3种披萨在"向量菜单"中:

披萨类型向量表示
玛格丽特[3, 8, 1]
辣香肠[7, 6, 5]
四季披萨[5, 5, 2]

顾客到来:生成查询向量

你说:“我想要一份比较咸、芝士多但不太辣的披萨”,AI将其转换为查询向量:
[7, 9, 2]

相似度计算实战

1. 欧氏距离计算(值越小越相似)

数学定义

L2(x,y) = √Σ(x_i - y_i)²

计算与玛格丽特披萨的距离:

√[(7-3)² + (9-8)² + (2-1)²] 
= √(16 + 1 + 1) 
= √18 ≈ 4.24

与辣香肠的距离:

√[(7-7)² + (9-6)² + (2-5)²]
= √(0 + 9 + 9)
= √18 ≈ 4.24

与四季披萨的距离:

√[(7-5)² + (9-5)² + (2-2)²]
= √(4 + 16 + 0)
= √20 ≈ 4.47

结果:玛格丽特和辣香肠并列最近(4.24)

2. 余弦相似度计算(值越大越相似)

数学定义:

cos(x,y) = (x·y)/(||x||*||y||)

计算与玛格丽特披萨的相似度:

分子:7*3 + 9*8 + 2*1 = 21 + 72 + 2 = 95
分母:√(7²+9²+2²) * √(3²+8²+1²) 
= √(49+81+4) * √(9+64+1)
= √134 * √74 ≈ 11.58 * 8.60 ≈ 99.6

相似度:95/99.6 ≈ 0.954
与辣香肠的相似度:

7*7 + 9*6 + 2*5 = 49 + 54 + 10 = 113
√134 * √(7²+6²+5²) = 11.58 * √110 ≈ 11.58*10.49≈121.5
相似度:113/121.5 ≈ 0.930

与四季披萨的相似度:

7*5 + 9*5 + 2*2 = 35 + 45 + 4 = 84
√134 * √(5²+5²+2²) = 11.58 * √54 ≈ 11.58*7.35≈85.1
相似度:84/85.1 ≈ 0.987

结果:四季披萨最相似(0.987)!

关键发现:度量选择影响结果

  1. 欧氏距离推荐:
    • 玛格丽特(咸度3)和辣香肠(咸度7)
    • 虽然玛格丽特咸度不符合要求,但芝士量接近
  2. 余弦相似度推荐:
    • 四季披萨(咸度5)
    • 因为它的特征比例最接近查询(咸:芝士:辣 ≈ 7:9:2 vs 5:5:2)

现实启示

  • 欧氏距离像"绝对匹配":适合找特征值接近的产品
  • 余弦相似度像"比例匹配":适合找风味组合相似的菜品
  • 向量数据库就是这位聪明的服务员,能快速比较数百种披萨的特征
# 用代码验证我们的计算
import numpy as npmenu = {"Margherita": np.array([3, 8, 1]),"Pepperoni": np.array([7, 6, 5]),"Quattro": np.array([5, 5, 2])
}query = np.array([7, 9, 2])# 欧氏距离计算
print("欧氏距离:")
for name, vec in menu.items():dist = np.linalg.norm(query - vec)print(f"{name}: {dist:.2f}")# 余弦相似度计算
print("\n余弦相似度:")
for name, vec in menu.items():cosine = np.dot(query, vec) / (np.linalg.norm(query)*np.linalg.norm(vec))print(f"{name}: {cosine:.3f}")

输出结果:

欧氏距离:
Margherita: 4.24
Pepperoni: 4.24
Quattro: 4.47余弦相似度:
Margherita: 0.954
Pepperoni: 0.930
Quattro: 0.987

结语

这个美味的例子展示了:不同的相似度度量会导致不同的推荐结果,实际应用中需要根据业务需求选择合适的度量方式。向量数据库的价值就在于它能高效处理这类比较操作,即使面对百万级"菜单"也能快速响应。

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

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

相关文章

人工智能和机器学习在包装仿真中的应用与价值

引言 随着包装成为消费品关键的差异化因素,对智能设计、可持续性和高性能的要求比以往任何时候都更高 。为了满足这些复杂的期望,公司越来越多地采用先进的仿真方法,而现在人工智能 (AI) 和机器学习 (ML) 又极大地增强了这些方法 。本文探讨…

【人工智能】深入探索Python中的自然语言理解:实现实体识别系统

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 自然语言理解(NLU)是人工智能(AI)领域中的重要研究方向之一,其目标是让计算机理解和处理人类语言。在NLU的众多应用中,实体识别(Nam…

个人健康中枢的多元化AI硬件革新与精准健康路径探析

在医疗信息化领域,个人健康中枢正经历着一场由硬件技术革新驱动的深刻变革。随着可穿戴设备、传感器技术和人工智能算法的快速发展,新一代健康监测硬件能够采集前所未有的多维度生物数据,并通过智能分析提供精准的健康建议。本文将深入探讨构成个人健康中枢的最新硬件技术,…

深入了解Linux系统—— 进程切换和调度

前言: 了解了进程的状态和进程的优先级,我们现在来看进程是如何被CPU调度执行的。 在单CPU的系统在,程序是并发执行的;也就是说在一段时间呢,进程是轮番执行的; 这也是说一个进程在运行时不会一直占用CPU直…

阿里云服务迁移实战: 06-切换DNS

概述 按前面的步骤,所有服务迁移完毕之后,最后就剩下 DNS 解析修改了。 修改解析 在域名解析处,修改域名的解析地址即可。 如果 IP 已经过户到了新账号,则不需要修改解析。 何确保业务稳定 域名解析更换时,由于 D…

uni-app 中封装全局音频播放器

在开发移动应用时,音频播放功能是一个常见的需求。无论是背景音乐、音效还是语音消息,音频播放都需要一个稳定且易于管理的解决方案。在 uni-app 中,虽然原生提供了 uni.createInnerAudioContext 方法用于音频播放,但直接使用它可…

golang常用库之-标准库text/template

文章目录 golang常用库之-标准库text/template背景什么是text/templatetext/template库的使用 golang常用库之-标准库text/template 背景 在许多编程场景中,我们经常需要把数据按照某种格式进行输出,比如生成HTML页面,或者生成配置文件。这…

Linux btop 使用教程

简介 btop 是一个基于终端的现代系统资源监控器,具有美观的图形界面、响应快、功能丰富等特点。它支持查看 CPU、内存、磁盘、网络、进程,并可以方便地筛选和管理进程。 功能总览 启动命令: btop界面分为以下几部分: CPU 区域…

Vue3调度器错误解析,完美解决Unhandled error during execution of scheduler flush.

目录 Vue3调度器错误解析,完美解决Unhandled error during execution of scheduler flush. 一、问题现象与本质 二、七大高频错误场景与解决方案 1、Setup初始化陷阱 2、模板中的"幽灵属性" 3、异步操作的"定时炸弹" 4、组件嵌套黑洞 5…

使用DeepSeek定制Python小游戏——以“俄罗斯方块”为例

前言 本来想再发几个小游戏后在整理一下流程的,但是今天试了一下这个俄罗斯方块的游戏结果发现本来修改的好好的的,结果后面越改越乱,前面的版本也没保存,根据AI修改他是在几个版本改来改去,想着要求还是不能这么高。…

Kotlin带接收者的Lambda介绍和应用(封装DialogFragment)

先来看一个具体应用:假设我们有一个App,App中有一个退出应用的按钮,点击该按钮后并不是立即退出,而是先弹出一个对话框,询问用户是否确定要退出,用户点了确定再退出,点取消则不退出,…

ES6/ES11知识点 续一

模板字符串 在 ECMAScript(ES)中,模板字符串(Template Literals)是一种非常强大的字符串表示方式,它为我们提供了比传统字符串更灵活的功能,尤其是在处理动态内容时。模板字符串通过反引号&…

【C++】智能指针RALL实现shared_ptr

个人主页 : zxctscl 专栏 【C】、 【C语言】、 【Linux】、 【数据结构】、 【算法】 如有转载请先通知 文章目录 1. 为什么需要智能指针?2. 内存泄漏2.1 什么是内存泄漏,内存泄漏的危害2.2 内存泄漏分类(了解)2.3 如何…

ROS2 开发踩坑记录(持续更新...)

1. 从find_package(xxx REQUIRED)说起,如何引用其他package(包) 查看包的安装位置和include路径详细文件列表 例如,xxx包名为pluginlib # 查看 pluginlib 的安装位置 dpkg -L ros-${ROS_DISTRO}-pluginlib | grep include 这条指令的目的是…

系统思考:困惑源于内心假设

不要怀疑,你的困惑来自你的假设。 你是否曾经陷入过无解的困境,觉得外部环境太复杂,自己的处境无法突破?很多时候,答案并不在于外部的局势,而是来自我们内心深处的假设——那些我们理所当然、从未质疑过的…

GitHub修炼法则:第一次提交代码教学(Liunx系统)

前言 github是广大程序员们必须要掌握的一个技能,万事开头难,如果成功提交了第一次代码,那么后来就会简单很多。网上的相关资料往往都不是从第一次开始,导致很多新手们会在过程中遇到很多权限认证相关的问题,进而被卡…

沥青路面裂缝的目标检测与图像分类任务

文章题目是《A grid‐based classification and box‐based detection fusion model for asphalt pavement crack》 于2023年发表在《Computer‐Aided Civil and Infrastructure Engineering》 论文采用了一种基于网格分类和基于框的检测(GCBD)&#xff…

【Flask】ORM模型以及数据库迁移的两种方法(flask-migrate、Alembic)

ORM模型 在Flask中,ORM(Object-Relational Mapping,对象关系映射)模型是指使用面向对象的方式来操作数据库的编程技术。它允许开发者使用Python类和对象来操作数据库,而不需要直接编写SQL语句。 核心概念 1. ORM模型…

C/C++滑动窗口算法深度解析与实战指南

C/C滑动窗口算法深度解析与实战指南 引言 滑动窗口算法是解决数组/字符串连续子序列问题的利器,通过动态调整窗口边界,将暴力解法的O(n)时间复杂度优化至O(n)。本文将系统讲解滑动窗口的核心原理、C/C实现技巧及经典应用场景,助您掌握这一高…

Vuex使用指南:状态管理

一、什么是状态管理?为什么需要 Vuex? 1. 状态管理的基本概念 在 Vue 应用中,状态指的是应用中的数据。例如: 用户登录状态购物车中的商品文章列表的分页信息 状态管理就是对这些数据的创建、读取、更新和删除进行有效管理。 …