载入数据–>整合数据(处理成以每行为一个用户对所有菜品评分的列表)–>Pearson相关系数
–>选取前五十名相关系数用户,加权计算推荐系数
本文参考了csdn另一个作者Charlie1492的文章,贴在这里:
https://blog.csdn.net/qq_19869749/article/details/103595095
什么是Pearson相关系数?
皮尔森相关系数反应了两个变量之间的线性相关程度,它的取值在[-1, 1]之间。反应在图片上大概是这样:(hotmap)
这个图(热度图)应该在python的missingno工具箱是可以画的,不细说;matlab也有现成求pearson系数的箱子;
Pearson系数的公式:
μ
μ
μ表示的是平均值。所以我们需要求平均值这一步。
#下面展示的是加权计算推荐系数部分
def choseFood(outdata, num):#outdata就是每行为一个用户对所有菜评分的列表
prr = calcAttribute(outdata, num)#pearson系数,calcAttribute算出来的是一个n行向量
list=[]
mid=[]
out_list=[]
food_rank=[]
for i in range(1682):
food_rank.append([i,0])#形成排名index
k=0
for i in range(943):
list.append([i,prr[i]])
for i in range(943):
for j in range(942-i):
if list[j][1]<list[j+1][1]:#根据pearson系数来调整菜排序
mid=list[j]
list[j]=list[j+1]
list[j+1]=mid
for i in range(1,51):
for j in range(0,1682):
food_rank[j][1]=food_rank[j][1]+outdata[list[i][0]][j]*list[i][1]/50
#j:菜品,菜品的rank等于它原本的0加i用户对菜j的评分乘i用户的pearson系数/50
for i in range(1682):#根据rank排序
for j in range(1681-i):
if food_rank[j][1]<food_rank[j+1][1]:
mid=food_rank[j]
food_rank[j]=food_rank[j+1]
food_rank[j+1]=mid
for i in range(1,1682):
if(outdata[num-1][food_rank[i][0]]==0):#编号num用户对按pearson的排行榜里第i个菜的评分为0(也就是没有点过这个菜)
mark=0
for d in out_list:#d是“菜品-推荐系数”
if d[0]==j:
mark=1
if mark!=1:
k+=1
out_list.append(foof_rank[i])
if k==10:
break
return food_rank
菜品的数据格式:
菜品id 上架时间 0 0 0 0 0 0 1 0 1 0 .。。。(这里是19个特征,有就1,没有就0)
用户评分数据格式:
用户id 菜品id 评分(0-5)