聊一聊几种衡量推荐算法的度量---准确率、召回率、覆盖率、新颖度

准确率

  • 准确率用来衡量推荐结果中有多少推荐被用户所接受.

某电商网站推荐给我100个商品,而我点击了其中的20个商品
那么该电商网站推荐系统的准确率 = 20 / 100 = 0.2

准确率计算公式定义为
P r e c i s i o n = ∑ u ∣ R ( u ) ⋂ T ( u ) ∣ ∑ u ∣ R ( u ) ∣ Precision = \frac{\sum_{u} |R(u) \bigcap T(u)|}{ \sum_{u} |R(u)| } Precision=uR(u)uR(u)T(u)
其中,
R ( u ) 表示用户 u 推荐 N 个物品 R(u) 表示用户u推荐N个物品 R(u)表示用户u推荐N个物品
T ( u ) 表示用户 u 在测试集上喜欢的物品集合 T(u) 表示用户u在测试集上喜欢的物品集合 T(u)表示用户u在测试集上喜欢的物品集合

'''
	train: 训练集
	test: 测试集
	train_similarity: 训练后计算的相似度
	K: 取K个近邻
	itemCount: 取前itemCount个物品推荐给用户
'''
def precision(train, test, train_similarity, K=8, itemCount = 10 ):
    print("-----------计算准确率中-----------")
    hit, all = 0,0
    for user in train.keys():
        Tu = test.get(user, {})
        # 推荐算法,train: 训练集, user: 要推荐的用户
        rank = recommend(train, user, train_similarity, K, itemCount)
        for item, _ in rank.items():
            if item in Tu:
                hit += 1
        all += itemCount
    return hit / (all * 1.0)

召回率

  • 召回率用来衡量原样本而言的,用户所喜欢的物品中有多少是推荐的

某电商网站推荐给我100个商品,但我总共点击了200个商品,其中有20个商品来自推荐给我的
那么该电商网站推荐系统的召回率 = 20 / 200 = 0.1

召回率计算公式定义为
R e c a l l = ∑ u ∣ R ( u ) ⋂ T ( u ) ∣ ∑ u ∣ T ( u ) ∣ Recall = \frac{\sum_{u} |R(u) \bigcap T(u)|}{ \sum_{u} |T(u)| } Recall=uT(u)uR(u)T(u)

def recall(train, test, train_similarity, K=8, itemCount = 10):
    print("-----------计算召回率中-----------")
    hit, all = 0,0
    for user in train.keys():
        Tu = test.get(user, {})
        rank = recommend(train, user, train_similarity, K, itemCount)
        for item, _ in rank.items():
            if item in Tu:
                hit += 1
        all += len(Tu)
    return hit / (all * 1.0)

覆盖率

  • 覆盖率用来衡量推荐的物品占总物品的比例

某电商网站推荐给我100个商品,但该网站共有1000个商品
那么该电商网站推荐系统的覆盖率 = 100 / 1000 = 0.1

覆盖率计算公式定义为
C o v e r a g e = 推荐的物品数 总物品数 = ∣ ⋃ u ϵ U R ( u ) ∣ ∣ I ∣ Coverage = \frac{推荐的物品数}{总物品数} = \frac{| \bigcup _{u\epsilon U } R(u) |}{|I|} Coverage=总物品数推荐的物品数=IuϵUR(u)

def coverage(train, test, train_similarity, K=8, itemCount = 10):
    print("-----------计算覆盖率中-----------")
    recommend_items, all_items = set(), set()
    for user in train.keys():
        for item in train[user].keys():
            all_items.add(item)
        rank = recommend(train, user, train_similarity, K, itemCount)
        for item, _ in rank.items():
            recommend_items.add(item)
    return len(recommend_items) / (len(all_items) * 1.0)

新颖度

  • 新颖度用来衡量推荐的物品受众是否受欢迎

新颖度计算公式定义为(查看了一些书籍,没找到准确定义新颖度的公式,下面是我根据代码推出来的公式,若有错误,望担待,若有准确的定义公式,望告知)
C o v e r a g e = 使用 l o g 函数作为惩罚的受欢迎程度之和 每个用户推荐的物品数之和 = ∑ l o g ( 1 + P ( R ( u ) ) ) ∑ ∣ R ( u ) ∣ N Coverage = \frac{使用log函数作为惩罚的受欢迎程度之和}{每个用户推荐的物品数之和} = \frac{\sum log(1 + P(R(u)))}{\sum_{|R(u)|} N} Coverage=每个用户推荐的物品数之和使用log函数作为惩罚的受欢迎程度之和=R(u)Nlog(1+P(R(u)))
其中,
R ( u ) 表示推荐给用户的结果 R(u) 表示推荐给用户的结果 R(u)表示推荐给用户的结果
P ( R ( u ) ) 表示推荐给用户的物品的新颖度 P(R(u)) 表示推荐给用户的物品的新颖度 P(R(u))表示推荐给用户的物品的新颖度
N 表示每个用户的推荐结果之和 N 表示每个用户的推荐结果之和 N表示每个用户的推荐结果之和

def popularity(train, test, train_similarity, K=8, itemCount = 10):
    print("-----------计算新颖率中-----------")
    item_popularity = dict()
    for user, items in train.items():
        for item in items.keys():
            if item not in item_popularity:
                item_popularity[item] = 0
            item_popularity[item] += 1
    ret = 0
    n = 0
    for user in train.keys():
        rank = recommend(train, user, train_similarity, K, itemCount)
        for item, _ in rank.items():
            ret += math.log(1 + item_popularity[item])
            n += 1
    return ret / n * 1.0
  • 0
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值