赞
踩
余弦相似度:用向量空间中两向量夹角的余弦值作为衡量两个个体之间差异的大小。余弦值越接近1,表明两个向量的夹角越接近0度,则两个向量越相似。余弦值越接近0,表明两个向量的夹角越接近180度,则两个向量越不相似。
如存在向量a=(x1,y1)和向量b=(x2,y2),由几何定义计算内积a·b=|a||b|cosθ,可知:
则根据二维向量引向多维向量A(x1,y1,z1…)和B(x2,y2,z2…),其中Ai和Bi为向量中的各个分量。可得:
简单举例:根据一下三个用户对不同物品的偏好记录,计算三个用户间的相似度。
计算用户AB之间的余弦相似度为:
计算用户AC之间的余弦相似度为:
计算用户BC之间的余弦相似度为:
由上述计算结果可知:用户AC之间相似度高,用户AB之间相似度高低,则可以把用户C感兴趣的物品F推荐给用户A。
python代码计算:
#encoding=utf-8 # 余弦相似度计算 # 物品A 物品B 物品C 物品D 物品E 物品F # 用户A 1 0 1 0 1 未知 # 用户B 0 1 1 1 1 0 # 用户C 1 0 1 0 0 1 import math def 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)
结果展示:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。