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