def PrecisionAndRecallAndCoverageAndPopularity(train, test, item_popularity, K, W, N, method=1): hit = 0 num_rank = 0 num_tu = 0 recommend_items = set() all_items = set() popularity = 0.0 if method == 1: for user in train: # test / train if user not in test: continue all_items = all_items | set(train[user][0]) tu = test[user][0] rank = UserCF.Recommend(user, train, W, K, N) recommend_items = recommend_items | set(rank) # hit += len(np.intersect1d(rank, tu)) for item in rank: if item in tu: hit += 1 popularity += math.log(1 + item_popularity[item]) # for item, value in rank.items(): # if item in tu: # hit += 1 num_rank += len(rank) num_tu += len(tu) # print('Hit: ', hit) # print('Rank num: ', num_rank) # print('Test user\'s item num:', num_tu) # print(len(all_items), len(recommend_items)) return hit / (num_rank * 1.0), hit / ( num_tu * 1.0), len(recommend_items) / (len(all_items) * 1.0), popularity / (num_rank * 1.0) elif method == 2: for user in train: # test / train if user not in test: continue all_items = all_items | set(train[user][0]) tu = test[user][0] rank = ItemCF.Recommend(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('Hit: ', hit) # print('Rank num: ', num_rank) # print('Test user\'s item num:', num_tu) # print(len(all_items), len(recommend_items)) return hit / (num_rank * 1.0), hit / ( num_tu * 1.0), len(recommend_items) / (len(all_items) * 1.0), popularity / (num_rank * 1.0)