基于用户的协调过滤算法
但是在该过程计算相似度时,算法的时间复杂度往往会很高,到遇到很大的数据量时会非常的耗时,事实上,很多用户相互之间并没有对同样的物品产生过行为,为此,可以构建一个物品到用户的倒排表,对于每个物品都保存对该物品产生过行为的用户列表。可以用以下代码实现:
#建立物品倒排表,计算物品相似度 def itemCF(user_dict): N=dict() C=defaultdict(defaultdict) W=defaultdict(defaultdict) for key in user_dict: for i in user_dict[key]: if i[0] not in N.keys(): #i[0]表示movie_id N[i[0]]=0 N[i[0]]+=1 #N[i[0]]表示评论过某电影的用户数 for j in user_dict[key]: if i==j: continue if j[0] not in C[i[0]].keys(): C[i[0]][j[0]]=0 C[i[0]][j[0]]+=1 #C[i[0]][j[0]]表示电影两两之间的相似度,eg:同时评论过电影1和电影2的用户数 for i,related_item in C.items(): for j,cij in related_item.items(): W[i][j]=cij/math.sqrt(N[i]*N[j]) return W
完整的计算用户相似度的算法可参考以下代码:
# coding=utf-8 from math import sqrt import pandas as pd import tqdm #line = [user,source,item,lable] users = {} users_list = list() path = 'C:...' for line in open(path+"..."):