协同过滤就是通过将用户和其他用户的数据进行对比来实现推荐的。
(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