예제 #1
0
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)