余弦相似性
介绍
余弦相似度,又称为余弦相似性,是通过计算两个向量的夹角余弦值来评估他们的相似度。余弦相似度将向量根据坐标值,绘制到向量空间中,如最常见的二维空间。
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
常用于文本相似度的计算。在文本中,向量通常是一组词语的词向量,通过计算这些词向量的余弦相似度来评估文本之间的相似度。
两个向量间的余弦值可以通过使用欧几里得点积公式求出:
给定两个属性向量,A和B,其余弦相似性θ由点积和向量长度给出,如下所示:
这里的\(A_i, B_i\)分别代表向量A和B的各分量。
给出的相似性范围从-1到1:-1意味着两个向量指向的方向正好截然相反,1表示它们的指向是完全相同的,0通常表示它们之间是独立的,而在这之间的值则表示中间的相似性或相异性。
对于文本匹配,属性向量A和B通常是文档中的词频向量。余弦相似性,可以被看作是在比较过程中把文件长度正规化的方法。
代码实现
使用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。
标签:similarity,余弦,np,cosine,应用,相似性,向量 From: https://www.cnblogs.com/itelephant/p/17408131.html