一、定义及概念:
余弦取值范围为[-1,1]。求得两个向量的夹角,并得出夹角对应的余弦值,此余弦值就可以用来表征这两个向量的相似性。夹角越小,趋近于0度,余弦值越接近于1,它们的方向更加吻合,则越相似。当两个向量的方向完全相反夹角余弦取最小值-1。当余弦值为0时,两向量正交,夹角为90度。因此可以看出,余弦相似度与向量的幅值无关,只与向量的方向相关。
由于连续离散点连线的斜率存在无穷大的问题,所以,把角度和斜率转换为向量夹角余弦值,方便比较相似度。
二、代码:
import numpy as np
def cos_sim(vector_a, vector_b):
"""
计算两个向量之间的余弦相似度
:param vector_a: 向量 a
:param vector_b: 向量 b
:return: sim
"""
vector_a = np.mat(vector_a)
vector_b = np.mat(vector_b)
num = float(vector_a * vector_b.T)
#或者用np自带的matmul()
#num = np.matmul(vector_a,vector_b.T)
denom = np.linalg.norm(vector_a) * np.linalg.norm(vector_b)
cos = num / denom
#因为余弦值的范围是[-1, +1] ,相似度计算时一般需要把值归一化到[0, 1],一般通过如下方式:
sim = 0.5 + 0.5 * cos
return sim
a = [0.1,0.2,0.3]
b = [2,3,4]
print(cos_sim(a,b))
尝试使用如下代码,结果显示:ambigous。
def cos(vector1,vector2):
dot_product = 0.0
normA = 0.0
normB = 0.0
for a,b in zip(vector1,vector2):
dot_product += a*b
normA += a**2
normB += b**2
if normA == 0.0 or normB==0.0:
return None
else:
return dot_product / ((normA*normB)**0.5)
版权声明:本文为qq_34333481原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。