Elasticsearch:什么是余弦相似度?

news/2025/3/14 18:15:39/

余弦相似度是数据科学、文本分析和机器学习领域的基本概念。 如果你想知道什么是余弦相似度或者它如何在现实世界的应用程序中使用,那么你来对地方了。

本指南旨在让你深入了解相似性是什么、其数学基础、优点及其在不同领域的各种应用。读完本指南后,你将能够充分理解、实施并充分利用你的项目或研究中的相似性。

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 构建面部识别系统


http://www.ppmy.cn/news/1167151.html

相关文章

微信小程序数据交互------WXS的使用

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《Spring与Mybatis集成整合》《Vue.js使用》 ⛺️ 越努力 &#xff0c;越幸运。 1.数据库连接 数据表结构&#xff1a; 数据测式&#xff1a; 2.后台配置 pom.xml <?xml version&quo…

基于Java的书店仓库管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

编程题总结 --- 2018

&#xff08;1&#xff09;输入一串字符串&#xff0c;字符串以“#”结尾&#xff0c;判断输入的字符串中0至9的个数。 #include<iostream>using namespace std;int main(){int sum 0;string s;while(cin >> s){if(s "#") break;int n s.size();for(…

PeopleCode中Date函数的用法

语法 Date(date_num) 描述 The Date function takes a number in the form YYYYMMDD and returns a corresponding Date value. If the date is invalid, Date displays an error message. Date函数输入是一个形如“YYYYMMDD”的数字&#xff0c;返回一个相应的Date类型的值…

C++ vector 的使用

CSDN的uu们&#xff0c;大家好。这里是C入门的第十七讲。 座右铭&#xff1a;前路坎坷&#xff0c;披荆斩棘&#xff0c;扶摇直上。 博客主页&#xff1a; 姬如祎 收录专栏&#xff1a;C专题 目录 1. 构造函数 1.1 vector(size_t n, const T& val T()) 1.2 vector…

Vue 3.0中Treeshaking特性是什么?

一、是什么 Tree shaking 是一种通过清除多余代码方式来优化项目打包体积的技术&#xff0c;专业术语叫 Dead code elimination 简单来讲&#xff0c;就是在保持代码运行结果不变的前提下&#xff0c;去除无用的代码 如果把代码打包比作制作蛋糕&#xff0c;传统的方式是把鸡…

Java RestTemplate使用TLS1.0(关闭SSL验证)

1. 问题 使用RestTemplate调用Http API时&#xff0c;服务器是TLS1.0&#xff0c;但是客户端Java默认禁止TLS1.0&#xff0c;会报错&#xff1a;org.springframework.web.client.ResourceAccessException: I/O error on POST request for “https://10.255.200.114/health”: …

MATLAB - excel 读取

matlab中excel 读取 1. 写入excel文件 - xlswrite2. 读取excel文件 - xlsread 1. 写入excel文件 - xlswrite xlswrite(filename,A,sheet,xlRange) % 写入字符串 % 注意事项&#xff1a;Str需要是Cell格式&#xff0c;否则一个字母占一格 % Str {‘abc’}&#xff1b; xlswr…