def PrecisionRecall(train, test, W, N, K): # N为推荐物品的TopN,K为和用户兴趣相似的K个用户 hit = 0 p_all = 0 r_all = 0 for user in train.keys(): tu = test.get(user, {}) # 用户user在测试集上喜欢的物品集合,是一个字典 # if tu: # 由于|R(u)|=N是人为设定要推荐的物品数,所以此处就没必要为tu为空的user做推荐计算了 rank_all = ItemCF.ItemCF_IUFNormRecommend(train, user, W, K) # K为指定的相似物品数 rank_TopN = sorted(rank_all.items(), key=itemgetter(1), reverse=True)[0:N] # 推荐给用户user的TopN物品及对应的预测出来的user对该物品的兴趣度 # for item, pui in rank_all.items(): for item, pui in rank_TopN: if item in tu: hit += 1 p_all += N # p_all += len(rank_all) r_all += len(tu) return hit / p_all, hit / r_all
def Coverge(train, W, N, K): recommend_items = set() all_items = set() for user in train.keys(): for item in train[user].keys(): all_items.add(item) rank_all = ItemCF.ItemCF_IUFNormRecommend(train, user, W, K) rank_TopN = sorted(rank_all.items(), key=itemgetter(1), reverse=True)[0:N] # for item, pui in rank_all.items(): for item, pui in rank_TopN: recommend_items.add(item) return len(recommend_items) / len(all_items)
def Novelty(train, W, N, K): item_popularity = PopularityNums(train) ret = 0 n = 0 # n=用户数*TopN推荐列表中物品数N(推荐的物品总数) for user in train.keys(): rank_all = ItemCF.ItemCF_IUFNormRecommend(train, user, W, K) rank_TopN = sorted(rank_all.items(), key=itemgetter(1), reverse=True)[0:N] # for item, pui in rank_all.items(): for item, pui in rank_TopN: ret += math.log(1 + item_popularity[item]) n += 1 return ret / n