python-相似度计算的三种常用方法

协同过滤就是通过将用户和其他用户的数据进行对比来实现推荐的。

(1)相似度计算:用欧氏距离来计算。相似度用距离来衡量,距离越大,相似度越小;距离越小,相似度越大。

(2)皮尔逊相关系数:这个参数用来度量两个向量之间的相似度。corroef()进行计算,皮尔逊相关系数取值从-1到+1,我们可以通过0.5+0.5*corrcoef()来计算,将值调整归一化到0到1之间。

(3)余弦相似度:两个向量夹角的余弦值。夹角为90度,相似度为0,方向相同,相似度为1,方向相反,相似度为-1,取值范围也在-1到+1之间。因此,我们将它归一化到0到1之间。cos=AB/||A||||B||. 其中,||A|| ||B||表示2范数。利用linalg.norm().

# -*- coding: utf-8 -*-
"""
"""
from numpy import *
from numpy import linalg as la

def loadExData():
    return [[1,1,1,0,0],
            [2,2,2,0,0],
            [1,1,1,0,0],
            [5,5,5,0,0],
            [1,1,0,2,2],
            [0,0,0,3,3],
            [0,0,0,1,1]]
data=mat(loadExData())
def ecludSim(inA,inB):
    return 1.0/(1.0+la.norm(inA-inB)) #inA,inB是列向量
def pearSim(inA,inB):
#    print(inA,len(inA))
    if len(inA)<3:
        return 1.0
    else:
#        print("corrcoef(inA,inB,rowvar=0)",corrcoef(inA,inB,rowvar=0))
        #对称矩阵,且corrcoef是x1x1,x1x2,x2x1,x2x2这四者系数。
#        print("corrcoef(inA,inB,rowvar=0)[0]",corrcoef(inA,inB,rowvar=0)[0])
        #由于两个变量,所以取第一行就是x1对所有变量的线性相关性,协方差。
#        print("corrcoef(inA,inB,rowvar=0)[0][1]",corrcoef(inA,inB,rowvar=0)[0][1])
        #第一行第二列就是x2x1,第二列和第二行一样都是第二个变量对所有其他变量的线性相关性。
        return 0.5+0.5*corrcoef(inA,inB,rowvar=0)[0][1]
def cosSim(inA,inB):#inA,inB是列向量
    num=float(inA.T*inB)
    denom=la.norm(inA)*la.norm(inB)
    return 0.5+0.5*(num/denom)
print("ecludSim=",ecludSim(data[:,0],data[:,1]))
print("pearSim=",pearSim(data[:,1],data[:,1]))
print("cosSim=",cosSim(data[:,0],data[:,1]))
结果为:
ecludSim= 1.0
pearSim= 1.0
cosSim= 0.9999999999999999



猜你喜欢

转载自blog.csdn.net/weixin_42039090/article/details/80533505