余弦类似度介绍

余弦类似度是使用两个向量之间的夹角的余弦值来衡量两个向量之间的类似度,这个值的规模在-1到1之间。

余弦类似度越挨近1,表明两个向量之间的夹角越小,即越类似;而越挨近-1,表明两个向量之间的夹角越大,即越不类似。

两个向量的夹角示例图如下:

类似度核算——余弦类似度

余弦类似度的核算公式

向量的余弦类似度核算公式

a,b为两个向量,余弦距离核算公式为:

cos⁡=a⃗⋅b⃗∣a⃗∣⋅∣b⃗∣cos theta = frac{vec{a} cdot vec{b} }{left | vec{a} right | cdot left | vec{b} right |}
  • 分子为向量a与向量b的内积,分母为向量a的模乘以向量b的模。
  • 向量模(即向量的长度)核算方法如下:
x⃗=(x1,x2,…xn)vec{x}=(x_1,x_2,…x_n)
∣x⃗∣=x12 x22 … xn2left | vec{x} right |=sqrt{x_1^2 x_2^2 … x_n^2}

n维向量的余弦类似度核算

nn维空间中,对于向量A=(a1,a2,…,an)A=(a_1,a_2,…,a_n)B=(b1,b2,…,bn)B=(b_1,b_2,…,b_n),核算其余弦值的公式为:

cos⁡=∑1n(ai⋅bi)∑1nai2⋅∑1nbi2cos theta = frac{sum_{1}^{n}(a_icdot b_i) }{sqrt{sum_{1}^{n}a_i^2}cdot sqrt{sum_{1}^{n}b_i^2}}

余弦类似度的取值规模为[-1,1],越挨近于1表明类似度越高。

余弦类似度核算的示例代码

用Python完成余弦类似度核算时,咱们能够使用NumPy库来核算余弦类似度,示例代码如下:

import numpy as np
def cosine_similarity(A, B):
    dot_product = np.dot(A, B)
    norm_A = np.linalg.norm(A)
    norm_B = np.linalg.norm(B)
    cosine_sim = dot_product / (norm_A * norm_B)
    return cosine_sim
vector1 = np.array([1, 2, 3])
vector2 = np.array([4, 5, 6])
similarity = cosine_similarity(vector1, vector2)
print("余弦类似度:", similarity)
  • 补充解释:linalg.norm()是NumPy库中用于核算向量或矩阵的范数(或长度)的函数。在核算欧式距离时,能够用来核算向量之间的差异。如下实例代码核算单个向量的范数:
import numpy as np
# 核算向量的范数
x = np.array([1, 2, 3])
norm_x = np.linalg.norm(x)
print(norm_x)

余弦类似度的使用

余弦类似度在类似度核算中被广泛使用在文本类似度、引荐体系图画处理范畴

  • 如在文本类似度核算中,能够使用余弦类似度来比较两个文档的向量表明,然后判断它们的类似程度。
  • 又如在引荐体系中,能够使用余弦类似度来核算用户对不同产品的喜爱程度,从而进行产品引荐。
  • 在图画处理中,能够将图画表明为特征向量,并使用核算余弦类似度来比较图画之间的类似程度。

使用实例阐明

假定咱们有两篇文章A和文章B,单看整篇文章咱们感觉无从下手。

那么咱们从拆分的思路去想,就能够将文章拆分红词组,用这些词组组成词频向量,如此咱们就能够使用余弦类似度来核算词频向量之间的类似度。

  • 假如两篇文章的余弦类似度挨近1,那么它们在内容上是类似的;
  • 假如余弦类似度挨近0,则它们在内容上是不类似的。

这样的类似度核算方法能够在信息检索、自然语言处理等范畴得到广泛使用。