余弦相似性的应用

余弦相似性

介绍

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

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

cosine_similarity(A,B)=(A·B)/||A||||B||

其中:

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

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

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

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

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

img

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

img

这里的Ai,Bi分别代表向量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。

posted @   三叶草body  阅读(469)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示