协同过滤假设用户过去的偏好也是他未来的偏好,通过利用过去的偏好作为确定用户之间相关性的指标。
不关心物品的描述属性,而是利用用户对他们的意见来计算相似度。
下为实现代码:
def standEst(dataMat, user, simMeas, item):
n=shape(dataMat)[1] #0为行,1为列,dataMat的列数,行为用户,列为物品,得到了物品数
simTotal=0.0
ratSimTotal=0.0
for j in range(n):
userRating = dataMat[user,j] #第user个用户对第j个物品的评价
if userRating == 0: continue #如果对于这个user对于某个物品的评分为0,跳过这个物品
overLap = nonzero(logical_and(dataMat[:,item] .A>0,dataMat[:,j] .A>0))[0]
#.A将矩阵转化为数组
#dataMat[:,item]>0表示目标物品对应列哪些大于0为True,dataMat[:,j]>0表示所遍历的列
#大于零的为True,logical_and把他们合起来找出都大于0的部分,[0]来找出他们的行数,就是找
#哪些人!对这两个物品都评价过。
if len(overLap)==0 : similarity=0
else:similarity=simMeas(dataMat[overLap,item],dataMat[overLap,j])
print('the %d and %d similarity is: %f' % (item,j,similarity))
simTotal=simTotal+similarity
ratSimTotal=ratSimTotal+similarity*userRating
if simTotal == 0: return 0
else: return ratSimTotal/simTotal