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