def standEst(dataMat,user,simMeas,item):
"""
计算在给定相似度计算方法的前提下,用户对物品的估计评分值
:param dataMat: 数据矩阵
:param user: 用户编号
:param simMeas: 相似性度量方法
:param item: 物品编号
:return:
"""
#数据中行为用于,列为物品,n即为物品数目
n=shape(dataMat)[1]
simTotal=0.0
ratSimTotal=0.0
#用户的第j个物品
for j in range(n):
userRating=dataMat[user,j]
if userRating==0:
continue
#寻找两个用户都评级的物品
overLap=nonzero(logical_and(dataMat[:,item].A>0,dataMat[:,j].A>0))[0]
if len(overLap)==0:
similarity=0
else:
similarity=simMeas(dataMat[overLap,item],dataMat[overLap,j])
simTotal+=similarity
ratSimTotal+=simTotal*userRating
def recommend(dataMat,user,N=3,simMeas=cosSim,estMethod=standEst):
"""
推荐引擎,会调用standEst()函数
:param dataMat: 数据矩阵
:param user: 用户编号
:param N:前N个未评级物品预测评分值
:param simMeas:
:param estMethod:
:return:
"""
#寻找未评级的物品,nonzeros()[1]返回参数的某些为0的列的编号,dataMat中用户对某个商品的评价为0的列
#矩阵名.A:将矩阵转化为array数组类型
#nonzeros(a):返回数组a中不为0的元素的下标
unratedItems=nonzero(dataMat[user,:].A==0)[1]
if len(unratedItems)==0:
return 'you rated everything!'
itemScores=[]
for item in unratedItems:
estimatedScore=estMethod(dataMat,user,simMeas,item)
itemScores.append((item,estimatedScore))
return sorted(itemScores,key=lambda jj:jj[1],reverse=True)[:N]
用户评论