余弦相似性的应用

发布时间 2023-05-17 11:44:11作者: 三叶草body

余弦相似性

介绍

余弦相似度,又称为余弦相似性,是通过计算两个向量的夹角余弦值来评估他们的相似度。余弦相似度将向量根据坐标值,绘制到向量空间中,如最常见的二维空间

cosine_similarity是一种度量两个非零向量之间夹角的相似性的方法。它的计算方法如下:

\(cosine\_similarity(A, B) = (A·B) / ||A||*||B||\)

其中:

\(A·B\)表示向量A和向量B对应位置上的元素乘积之和,也可以写成\(sum(Ai * Bi)\),即A和B的点积。

\(||A||\)表示向量A的模(长度),也可以写成\(sqrt(sum(Ai^2))\)

cosine_similarity的取值范围为-1到1之间,当\(cosine_similarity(A, B)\)等于1时,表示向量\(A\)\(B\)方向重合;当\(cosine\_similarity(A, B)\)等于-1时,表示向量A和B方向相反;当\(cosine\_similarity(A, B)\)等于0时,表示向量A和B方向垂直。

cosine_similarity常用于文本相似度的计算。在文本中,向量通常是一组词语的词向量,通过计算这些词向量的余弦相似度来评估文本之间的相似度。

两个向量间的余弦值可以通过使用欧几里得点积公式求出:

img

给定两个属性向量,AB,其余弦相似性θ由点积和向量长度给出,如下所示:

img

这里的\(A_i, B_i\)分别代表向量A和B的各分量

给出的相似性范围从-1到1:-1意味着两个向量指向的方向正好截然相反,1表示它们的指向是完全相同的,0通常表示它们之间是独立的,而在这之间的值则表示中间的相似性或相异性。

对于文本匹配,属性向量AB通常是文档中的词频向量。余弦相似性,可以被看作是在比较过程中把文件长度正规化的方法。

image

代码实现

使用numpy计算余弦相似度

在Python中,可以使用NumPy库来计算cosine similarity。以下是用Python实现cosine similarity的代码:

import numpy as np

def cosine_similarity(a, b):
    """
    计算向量a和向量b之间的cosine similarity
    """
    # 计算分子
    numerator = np.dot(a, b)
    
    # 计算分母
    denominator = np.linalg.norm(a) * np.linalg.norm(b)
    
    # 计算cosine similarity
    similarity = numerator / denominator
    
    return similarity

其中,a和b是两个一维numpy数组,分别表示向量A和向量B。实际使用时,可以调用cosine_similarity函数并传入两个向量,例如:

a = np.array([1, 2, 3])
b = np.array([2, 3, 4])
similarity = cosine_similarity(a, b)
print(similarity)

输出结果为:

0.9925833339709303

这表示向量a和向量b之间的cosine similarity约为0.992。

使用sklearn

sklearn(Scikit-learn)库也提供了cosine_similarity的API,可以直接使用。以下是使用sklearn计算cosine_similarity的示例代码:

from sklearn.metrics.pairwise import cosine_similarity
import numpy as np

# 定义两个向量
a = pd.DataFrame(data=[[1, 2, 3]])
b = pd.DataFrame(data=[[2, 3, 4]])

# 计算cosine similarity矩阵
similarity_matrix = cosine_similarity(a, b)

# 输出结果  去对角线
print(np.diag(similarity_matrix))

这段代码将向量a和b组合成一个2行3列的矩阵,然后利用cosine_similarity函数计算出它们之间的cosine similarity矩阵。输出结果为:

[[1.         0.99258333]
 [0.99258333 1.        ]]

分析输出结果可知,矩阵的对角线上的值都是1,表示向量与其自身之间的cosine similarity为1;矩阵的两个非对角线上的值都是0.99258333,表示向量a和向量b之间的cosine similarity。