1.2_python实现1.1中的用户偏好计算
假设物品在各属性上的取值要么为 0,要么为 1。假设物品集的属性矩阵为 item_feature,并假设我们已基于用户评分矩阵得到了一个字典user_dict,该字典的键为各个用户,每个键的值也是一个字典,这个次级字典记录了该用户对他发生过行为的物品的评分。也就是说次级字典的键为各个物品,值为该用户对该物品的评分。由于通常单个用户所发生行为的物品的数量并不太多,所以次级字典里面的键的数目也不太多,这样计算量比较小。
下面我们写个函数来计算用户偏好。
def user_prefer(user_dict, item_feature):
user_pre = {} # 此处用字典格式来保存用户偏好
for user in user_dict.keys(): # 遍历每一个用户
grade = user_dict[user].values() # 取出该用户所有的评分
average = sum(grade) / len(grade) # 求出了该用户打分的平均分
user_pre[user] = [] # 用一个list来保存该用户的属性系数
for feature in range(v): # 遍历每一个属性,v是属性的数目
score = 0
k_feature = 0
for item in user_dict[user].keys(): # 遍历该用户发生行为的所有物品
if item_feature[int(item)][feature] == 1:
score += (user_dict[user][item] - average)
k_feature += 1
if k_feature != 0:
user_pre[user].append(score / k_feature)
else:
user_pre[user].append(0.0)
return user_pre
注意:上面我们假设了item_feature中的各行对应于不同物品,并已将物品按顺序进行编号,属性从0到(v - 1)进行编号,如此才能应用 if item_feature[int(item)][feature] == 1: 这样的表达。如果item_feature是用字典方式保存的数据,可能用起来灵活性更好些。