Elasticsearch:什么是余弦相似度?
余弦相似度是数据科学、文本分析和机器学习领域的基本概念。 如果你想知道什么是余弦相似度或者它如何在现实世界的应用程序中使用,那么你来对地方了。
本指南旨在让你深入了解相似性是什么、其数学基础、优点及其在不同领域的各种应用。读完本指南后,你将能够充分理解、实施并充分利用你的项目或研究中的相似性。
Cosine similarity 是在我们在 Elasticsearch 向量搜索配置 dense vector 相似性其中的一个选项。具体可以详细参阅 dense vector。
余弦相似度的意义
余弦相似度是一种衡量两组信息相似程度的数学方法。 用最简单的术语来说,它可以帮助我们通过查看两个元素所指向的 “方向” 来理解它们之间的关系,而不是仅仅根据它们各自的值进行比较。
想象一下,你是一名书籍爱好者,并且你对三本书进行了评分:《月球之谜》、《海洋的秘密》和《凤凰飞翔》。 你已按照 1 到 5 的等级对它们进行评分。你的朋友也按照相同的等级对这些相同的书进行了评分:
你们两个评分都可以表示为列表,或者用数学术语表示为 “向量”,表示为 [5, 3, 4] 和 [4, 2, 4]。
你和你的朋友有类似的评分吗? 你可以查看列表并得出定性的 “是的,它们非常接近”,或者你可以使用余弦相似度来达到定量测量! 我们将回到这个例子,但余弦相似度是一个在搜索引擎、自然语言处理和推荐系统等领域有着深远应用的概念。
余弦相似度提供了一种理解数据如何相互关联的方法,而不会陷入每个数据点所代表的具体细节的困境。 它还允许我们快速将信息与数十、数百甚至数千个元素进行比较。
余弦相似度广泛应用于自然语言处理 (NLP)、搜索算法和推荐系统等应用中。 它提供了一种强大的方法来理解文档、数据集或图像之间的语义相似性。 例如,向量搜索引擎中经常使用相似度来查找与给定查询最相关的记录,从而使搜索过程更加高效和精确。 (有关向量搜索的更多信息,你可以参考这篇文章!)
余弦相似度的定义
余弦相似度是衡量多维空间中两个非零向量之间角度余弦的度量。 稍后我们将了解其确切含义,但现在只需理解该值越接近 1,向量就越相似。 余弦相似度是有效的,因为它捕获向量的方向(或“方向”)而不是它们的大小,这使得它对数据模式的相似性敏感,而对向量的大小不敏感。
在数学上,它计算余弦相似度。 请注意,执行余弦相似度的最有效方法是将所有向量标准化为单位长度,并改为使用 dot_product。 仅当需要保留原始向量且无法提前对其进行标准化时,才应使用余弦。 文档 _score 的计算方式为 (1 + cosine(query, vector)) / 2。余弦相似度不允许向量具有零幅度,因为在这种情况下未定义余弦。
从余弦的曲线我们可以看到,当向量的角度为 0 时,余弦的值为最大 1。但凡有一些偏差,那么它的值就会变小 (0-1)。
一个例子
让我们回顾一下我们的图书评级示例。 我们有两个向量:
你的评分:[5, 3, 4]
你朋友的评分:[4, 2, 4]
使用余弦相似度,我们可以量化这些向量的相似程度。 余弦相似度将返回 -1 到 1 之间的值; 值越接近 1 表示相似度越高。 在我们的示例中,计算余弦相似度得到的值为 0.9899,这表明你和你的朋友对书籍的品味非常相似。 如果你有另一个朋友的评分为 [1, 5, 2],则余弦相似度将为 0.7230,表明品味不太相似。
math3d.org 网站可以提供一种可视化二维和三维向量的有用方法。 通过我们简单的示例向量,我们可以看到 [5, 3, 4] 和 [4, 2, 4] 之间的角度小于 [5, 3, 4] 和 [1, 5, 2] 之间的角度:
如果你想知道 “如果较小的角度意味着两个向量更相似,为什么我们不只使用角度 - 为什么所有这些复杂的数学?”,我们稍后会回答!
数据分析和 NLP 的重要性
余弦相似度在数据分析和自然语言处理等领域非常宝贵。 在 NLP 中,它经常用于文本挖掘、情感分析和文档聚类等任务。 该指标有助于比较两段文本以了解它们的语义相似性,这对于做出准确的推荐或分类至关重要。
余弦相似度与其他相似度度量有何不同
有多种方法可以测量数据集之间的相似性,欧几里得距离是另一种常用的度量标准。 欧几里德距离关注的是空间中两点之间的直线距离,而余弦相似度关注的是两个向量之间的角度。 这使得余弦相似性在捕获两组数据之间的模式相似性方面更加稳健,即使它们的大小不同。
如果我们想得到欧几里得的直线距离,我们可以在 dense vector 数据类型里设置 similarity: l2_norm。
例如,如果两个文档具有相同的单词但频率不同,则欧几里得距离可能会由于幅度(频率)的差异而认为它们完全不同。 然而,余弦相似度会更有效地捕获它们的相似度,因为它对单词的频率不太敏感,而更关注它们在文档中的存在或不存在。
余弦相似度的 “近亲” 是点积相似度。 它通常在矢量已经归一化(其大小为 1)时使用,从而避免除以其大小的乘积(始终为 1!)的计算步骤。 许多向量嵌入模型输出归一化向量,使点积相似度计算更快。
如果我们想得到点击 (dot product) 相似度,我们可以在 dense vector 里设置 simliarity: dot_product
通过 Elasticsearch 上的向量搜索将余弦相似度付诸实践
综上所述,余弦相似度提供了一种稳健、有效的相似度测量方法,具有广泛的应用,特别是在 NLP 和数据分析领域。 它关注向量的方向而不是大小,这使其与欧几里得距离等其他相似性度量区分开来。 无论你是在分析文本数据、提出建议还是进行复杂的数据分析,了解余弦相似度的细微差别都会非常有益。
准备好将余弦相似度付诸实践了吗? 请详细阅读文章 “Elasticsearch:如何部署 NLP:文本嵌入和向量搜索”。对于之前的评分向量例子,我们可以参考文章 “Elasticsearch:基于 Vector 的打分”。
余弦相似度的优点
余弦相似度是一种广泛使用的度量,在各种应用中具有多种优势,例如文本分析、推荐系统等。 以下是一些使其成为测量向量之间相似性的首选的主要优点。
不依赖于规模而变化
余弦相似度是不依赖于规模而变化,这意味着它不受向量大小的影响。 这在你只想关注向量的方向性而不是它们的长度的情况下特别有用。 无论向量中的值是数千万还是数百万,余弦相似度都将保持不变,从而使其在不同尺度上具有通用性。
降维
使用余弦相似度的另一个优点是它与主成分分析 (PCA) 和 t 分布随机邻域嵌入 (t-SNE) 等技术的兼容性。 由于它以角度而不是距离来衡量相似性,因此你可以减少向量的维度,而不会显着影响余弦相似性度量。
简单高效
计算余弦相似度的公式很简单,只需要向量及其大小的点积。 这种简单性带来了高效的计算,使其适合实时应用程序和大型数据集。
角度测量
与其他基于距离的相似性度量不同,余弦相似性考虑了向量之间的角度,提供了更直观的相似性感觉。 角度越小表示相似度越高,并且度量范围在 -1 和 1 之间,使解释更容易。
广泛应用于文本分析
余弦相似度在文本分析领域特别流行。 当文档转换为嵌入向量时,余弦相似度有效地捕获了不同文档之间的 “角度”,突出了内容的相关程度。
通过考虑这些优势,就可以清楚为什么余弦相似度是各种机器学习和数据科学应用中的流行选择。
揭示余弦相似度的力量
在结束时,让我们花点时间总结一下我们在这篇关于相似性的广泛指南中讨论的内容。 我们深入研究了这个令人着迷的指标的核心原理,向你展示了它的数学基础。 不要忘记它的众多优点,包括其规模不变性以及与降维技术的兼容性,这使其成为机器学习和数据科学领域的重要工具。
如果你想了解更关于 Elasticsearch 在向量搜索领域里的应用,请详细阅读 “Elastic:开发者上手指南” 中的 “NLP - 自然语言处理及向量搜索” 章节。\
更多阅读:Elasticsearch:如何使用 Elasticsearch 和 Python 构建面部识别系统
相关文章:

Elasticsearch:什么是余弦相似度?
余弦相似度是数据科学、文本分析和机器学习领域的基本概念。 如果你想知道什么是余弦相似度或者它如何在现实世界的应用程序中使用,那么你来对地方了。 本指南旨在让你深入了解相似性是什么、其数学基础、优点及其在不同领域的各种应用。读完本指南后,你…...
【每日一题Day352】LC1726同积元组 | 哈希表+排列组合
同积元组【LC1726】 给你一个由 不同 正整数组成的数组 nums ,请你返回满足 a * b c * d 的元组 (a, b, c, d) 的数量。其中 a、b、c 和 d 都是 nums 中的元素,且 a ! b ! c ! d 。 思路 求出所有二元组的积及其出现次数,假设某个积出现的次…...
react中在js文件里定义的变量,如何在less文件里去使用该变量
在 React 中,如果在 JS 文件中定义了变量,可以使用 CSS Modules 的方式将变量导出到 LESS 文件中。 以下是示例代码: // index.js import React from react; import styles from ./styles.module.less;const color red;function App() {re…...

TIA博途中通过SCATTER指令实现将字节BYTE拆分成单个位的具体方法示例
TIA博途中通过SCATTER指令实现将字节BYTE拆分成单个位的具体方法示例 例如: 我们想判断某个字节中各个位的状态是1还是0 ,如何实现呢? 这里介绍通过SCATTER指令拆分字节的方法,仅供大家参考。 首先,我们先了解以下SCATTER指令的基本功能和使用方法: 如下图所示,在基本指…...

网络协议--ARP:地址解析协议
4.1 引言 本章我们要讨论的问题是只对TCP/IP协议簇有意义的IP地址。数据链路如以太网或令牌环网都有自己的寻址机制(常常为48 bit地址),这是使用数据链路的任何网络层都必须遵从的。一个网络如以太网可以同时被不同的网络层使用。例如&#…...
pdf导出实例(itestpdf)
依赖 <!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf --><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.10</version></dependency>工具类 package or…...

关于CW32单片机pack包安装 KEIL IAR
CW32 系列微控制器软件开发工具入门 芯片包 1. 下载芯片包 官方下载链接:武汉鑫源半导体 2. 安装芯片包 双击芯片包.pack文件 支持 CW32F 系列的 IDE 支持 CW32F 系列的工具链: • • EWARM v7.70 或更高版本 MDK-ARM v5.17 或更高版本 2.1 EW…...

memcpy内存拷贝函数
目录 一、memcpy内存拷贝函数 注意事项 二、memcpy与strcpy对比 三、模拟实现memcpy函数 四、memcpy函数不能进行两块存在内存重叠的空间的内存拷贝 五、改进my_memcpy函数 一、memcpy内存拷贝函数 头文件:string.h 函数原型:void* memcpy(void* …...
数组模拟堆
文章目录 QuestionIdeasCode Question 维护一个集合,初始时集合为空,支持如下几种操作: I x,插入一个数 x ; PM,输出当前集合中的最小值; DM,删除当前集合中的最小值(数…...

【深度学习基础知识(一):卷积神经网络CNN基础知识】
深度学习基础知识 深度学习基础知识(一):卷积神经网络CNN基础知识 卷积神经网络CNN基础知识 0、目录 1. CNN卷积神经网络的特点 2. 卷积操作基础知识 2.1 卷积操作的概念2.2 卷积操作的种类2.3 卷积操作后特征图谱大小计算公式 3. 池化操…...

Git使用入门
一、Git简介 Git 是一个开源的分布式版本控制系统。 Git版本控制的功能为保存不同版本的代码,保存代码的地方叫做仓库。 每个仓库中有多个分支,每个分支上又有很多节点,每个节点代表一个版本,不同的分支可以进行合并࿰…...
电机矢量控制算法和例程
电机矢量控制算法是一种高级的电机控制方法,它通过将电机转子空间矢量转换到旋转坐标系中,并在该坐标系中进行控制来实现对电机的精确控制。下面是对电机矢量控制算法的详细解释: 坐标系变换:电机矢量控制首先将电机转子空间矢量变…...

std::string_view概念原理及应用
概念 使用const string&作为参数是先使用字符串字面量编译器会创建一个临时字符串对象然后创建std::string。 或者一个函数提供char*和const string&参数的两个版本函数,不是优雅的解决方案。 于是需要一个只使用内存不维护内存的类。 原理 在visual s…...
lodash库_.chunk、_.pick、_.omit、_.cloneDeep、_.debounce方法
lodash 模块化、高性能的 JavaScript 实用工具库。官方文档:https://www.lodashjs.com 1.对数组进行分组 _.chunk(array, [size1]) 使用场景,如移动端页面一行能放5个元素,总共7条数据,将一维数组转为二维数组,让一个…...
Java使用FFmpeg对视频文件打标记
免安装 FFmpeg <dependency><groupId>ws.schild</groupId><artifactId>jave-all-deps</artifactId><version>3.0.1</version><exclusions><!-- 排除windows 32位系统 --><exclusion><groupId>ws.sch…...

Redux 学习笔记
在使用 React Redux 前,我们首先了解一下 Redux 的一些基础知识。 Redux 是 JavaScript 应用程序中用于状态管理的容器。它不依赖于任何框架,可以与任何 UI 库和框架一起使用。在应用程序中使用 Redux 时,Redux 是以可预测的方式管理状态。 …...

【Bug】8086汇编学习
文章目录 随笔Bug1、masm编译报错:Illegal use of register2、debug中使用段前缀3、[idata]在编译器中的处理4、push立即数报错5、报错:improper operand type6、程序莫名跳转到未知位置 (doing)7、DOSBox失去响应8、程序运行显示乱码9、程序运行导致DOS…...

JetBrains系列IDE全家桶激活
jetbrains全家桶 正版授权,这里有账号授权的渠道: https://www.mano100.cn/thread-1942-1-1.html 附加授权后的一张图片...

洛谷p1618三连击
import java.util.Scanner; //将 1-9 共9个数分成3组,分别组成3个三位数,且使这3个三位数构成A:B:C的比例,试求出所有满足条件的3个三位数。不满足输出“No!!!”。 public class Main {public static void main(String[] args) {Scanner sc …...
微信公众号h5写一个全局调用微信分享功能
1. 首先先安装依赖 npm install weixin-js-sdk --save 2. app.vue文件 <script> export default { onLaunch: function(e) {}, onShow: function(e) { console.log(App Show页面初始); // 路由参数存缓存的 这是为了防止他…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...