推荐算法|相似度计算(1)——余弦相似度

余弦相似度 ??余弦相似度:用向量空间中两向量夹角的余弦值作为衡量两个个体之间差异的大小。余弦值越接近1,表明两个向量的夹角越接近0度,则两个向量越相似。余弦值越接近0,表明两个向量的夹角越接近180度,则两个向量越不相似。
??如存在向量a=(x1,y1)和向量b=(x2,y2),由几何定义计算内积a·b=|a||b|cosθ,可知:
推荐算法|相似度计算(1)——余弦相似度
文章图片

??则根据二维向量引向多维向量A(x1,y1,z1…)和B(x2,y2,z2…),其中Ai和Bi为向量中的各个分量。可得:
推荐算法|相似度计算(1)——余弦相似度
文章图片

??简单举例:根据一下三个用户对不同物品的偏好记录,计算三个用户间的相似度。
推荐算法|相似度计算(1)——余弦相似度
文章图片

计算用户AB之间的余弦相似度为:
推荐算法|相似度计算(1)——余弦相似度
文章图片

计算用户AC之间的余弦相似度为:
推荐算法|相似度计算(1)——余弦相似度
文章图片

计算用户BC之间的余弦相似度为:
推荐算法|相似度计算(1)——余弦相似度
文章图片

??由上述计算结果可知:用户AC之间相似度高,用户AB之间相似度高低,则可以把用户C感兴趣的物品F推荐给用户A。
python代码计算:

#encoding=utf-8 # 余弦相似度计算 #物品A 物品B 物品C 物品D 物品E 物品F # 用户A 10101未知 # 用户B 011110 # 用户C 101001 import mathdef CosSimilarity(list1,list2): if len(list1)!=len(list2): return -1 else: length=len(list1) s = sum(list1[i] * list2[i] for i in range(length)) den1 = math.sqrt(sum([pow(list1[j], 2) for j in range(length)])) den2 = math.sqrt(sum([pow(list2[k], 2) for k in range(length)])) return s / (den1 * den2)if __name__ == '__main__': vectorA = [1,0,1,0,1] vectorB = [0,1,1,1,1] vectorC = [1,0,1,0,0] #其实把这三个向量列表写在一个列表中比较好,那样更像一个矩阵cosA_B = CosSimilarity(vectorA,vectorB) cosA_C = CosSimilarity(vectorA,vectorC) cosB_C = CosSimilarity(vectorB,vectorC)print("A和B之间的余弦相似度:",cosA_B) print("A和C之间的余弦相似度:",cosA_C) print("B和C之间的余弦相似度:",cosB_C)

【推荐算法|相似度计算(1)——余弦相似度】结果展示:
推荐算法|相似度计算(1)——余弦相似度
文章图片

    推荐阅读