当前位置: 首页 > article >正文

余弦相似度

余弦相似度(Cosine Similarity) 是一种常用的度量两个向量之间相似度的方法,尤其适用于文本分析、信息检索、推荐系统等领域。它的核心思想是通过计算两个向量夹角的余弦值来衡量它们的相似度,而不是直接计算向量的欧几里得距离。余弦相似度的值范围从 -1 到 1,值越接近 1 表示两个向量越相似,值越接近 -1 表示两个向量越不相似。

1. 余弦相似度的定义

对于两个向量 A \mathbf{A} A B \mathbf{B} B,其余弦相似度可以表示为:
Cosine Similarity ( A , B ) = A ⋅ B ∥ A ∥ ∥ B ∥ \text{Cosine Similarity} (\mathbf{A}, \mathbf{B}) = \frac{\mathbf{A} \cdot \mathbf{B}}{\|\mathbf{A}\| \|\mathbf{B}\|} Cosine Similarity(A,B)=A∥∥BAB

其中:

  • A ⋅ B \mathbf{A} \cdot \mathbf{B} AB是向量 A \mathbf{A} A B \mathbf{B} B的点积。
  • ∥ A ∥ \|\mathbf{A}\| A ∥ B ∥ \|\mathbf{B}\| B 是向量 A \mathbf{A} A B \mathbf{B} B的模长(或范数)。

点积和向量的模长计算公式如下:

  • 点积: A ⋅ B = ∑ i = 1 n A i B i \mathbf{A} \cdot \mathbf{B} = \sum_{i=1}^{n} A_i B_i AB=i=1nAiBi
  • 向量的模长: ∥ A ∥ = ∑ i = 1 n A i 2 \|\mathbf{A}\| = \sqrt{\sum_{i=1}^{n} A_i^2} A=i=1nAi2

2. 余弦相似度的意义

  • 值范围:余弦相似度的结果是一个介于 -1 和 1 之间的值:
    • 1 表示完全相同的方向(即两个向量完全相似)。
    • 0 表示没有任何相似性(即两个向量垂直,方向完全不同)。
    • −1 ∼ \sim 1 表示完全相反的方向(即两个向量完全不相似)。
  • 不受向量大小影响:余弦相似度的计算仅考虑向量的方向,而不受其大小(长度)的影响。这使得它在许多实际应用中非常有效,尤其是在文本数据的向量化表示中。

3. 在 MATLAB 中计算余弦相似度

在 MATLAB 中,可以使用内置函数来计算两个向量的余弦相似度。下面是一个示例:

示例:计算两个向量的余弦相似度
% 定义两个向量 A 和 B
A = [1, 2, 3];
B = [4, 5, 6];

% 计算点积
dot_product = dot(A, B);

% 计算向量的模长
norm_A = norm(A);
norm_B = norm(B);

% 计算余弦相似度
cosine_similarity = dot_product / (norm_A * norm_B);

% 输出结果
disp(['Cosine Similarity: ', num2str(cosine_similarity)]);
解释:
  • dot(A, B):计算两个向量 A 和 B 的点积。
  • norm(A):计算向量 A 的模长。
  • 余弦相似度由公式 A ⋅ B ∥ A ∥ ∥ B ∥ \frac{A \cdot B}{\|A\| \|B\|} A∥∥BAB得到,表示两个向量的相似度。

4. 应用场景

  • 文本相似度计算:通过将文本转换为向量(例如使用词袋模型、TF-IDF 等),可以计算不同文本之间的余弦相似度来判断文本的相似性。
  • 推荐系统:在推荐系统中,余弦相似度用于衡量用户之间或物品之间的相似度,帮助预测用户的兴趣。
  • 图像处理:在图像处理中,余弦相似度可以用于比较图像的特征向量,帮助实现图像检索和匹配。

5. 使用 MATLAB 的 cosine 函数

MATLAB 提供了 cosine 函数来直接计算两个向量之间的余弦相似度(这只适用于计算余弦距离,通常是相似度的补充形式):

% 定义两个向量 A 和 B
A = [1, 2, 3];
B = [4, 5, 6];

% 计算余弦距离(cosine distance)
cosine_distance = cosine(A, B);

% 输出结果
disp(['Cosine Distance: ', num2str(cosine_distance)]);

http://www.kler.cn/a/411595.html

相关文章:

  • Http 请求协议
  • MT6769/MTK6769核心板规格参数_联发科安卓主板开发板方案
  • .NET9 - Swagger平替Scalar详解(四)
  • MySQL中in和exists的区别
  • C++设计模式(工厂模式)
  • 2023年十四届蓝桥杯Scratch01月stema选拔赛—鹦鹉学舌
  • 【初阶数据结构与算法】栈和队列leetcode刷题之用栈实现队列,用队列实现栈
  • linux上制作启动盘命令
  • 解决Ubuntu 22.04系统中网络Ping问题的方法
  • Win7下高版本node出现uv_os_gethostname returned ENOSYS错误
  • 数据分类问题-鸢尾花数据集
  • vscode查找函数调用
  • 路面泥泞,坑洼,裂缝,路面损坏,马路牙检测 YOLO标记资源整理
  • CSS之3D转换
  • C++软件设计模式之组合模式与其他模式的协作举例
  • 【Linux】Linux系统电源状态
  • go语言逆向-基础basic
  • Linux下一次性关闭多个同名进程
  • 数字图像处理(6):除法运算、除法器
  • 【C++知识总结1】c++第一篇,简单了解一下命名空间是什么