准确率
- 准确率用来衡量推荐结果中有多少推荐被用户所接受.
某电商网站推荐给我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=∑u∣R(u)∣∑u∣R(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=∑u∣T(u)∣∑u∣R(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=总物品数推荐的物品数=∣I∣∣⋃uϵ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)∣N∑log(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