def PrecisionAndRecallAndCoverageAndPopularity(train, test, item_popularity, K, W, N, method): """ 计算 准确率,召回率,覆盖率,流行度 Desc: Args: train test item_popularity K: 取相似度前K个 W: 相似度矩阵 N: TopN method: recommend 推荐方法 Returns: precision: 准确率 recall: 召回率 coverage: 覆盖率 popularity: 流行度 """ hit = 0 num_rank = 0 num_tu = 0 recommend_items = set() all_items = set() popularity = 0.0 for user in train: # test / train if user not in test: continue all_items = all_items | set(train[user][0]) tu = test[user][0] if method == 1: rank = ItemCF.Recommend1(user, train, W, K, N) elif method == 2: rank = ItemCF.Recommend2(user, train, W, K, N) for item, _ in rank: if item in tu: hit += 1 popularity += math.log(1 + item_popularity[item]) recommend_items.add(item) num_rank += len(rank) num_tu += len(tu) print(K, ': ', hit / (num_rank * 1.0), hit / (num_tu * 1.0), len(recommend_items) / (len(all_items) * 1.0), popularity / (num_rank * 1.0)) return hit / (num_rank * 1.0), hit / ( num_tu * 1.0), len(recommend_items) / (len(all_items) * 1.0), popularity / (num_rank * 1.0)