用推荐算法给用户推荐的N个物品集合,记为R(u), 令用户u在测试集上喜欢的物品集合为T(u)
就可以通过计算 准确率/召回率 来评测推荐算法的精度:
准确率 Precision = /
也就是推荐列表中用户真正喜欢的物品占推荐列表总数的比例,描述最终的推荐列表中有多少比例是发生过用户-物品评分记录
召回率 Recall =
也就是推荐列表中用户真正喜欢的物品占测试集上用户所有喜欢物品总数的比例,
描述了有多少比例的用户-物品评分记录包含在最终的推荐列表中
下面两段代码给出了 准确率/召回率 的计算方法:
```
def recall(train,test,N):
hit =0
all =0
for userin train.keys():
tu =test[user]#tu为测试集上该用户有过评分记录的物品集合
rank = GetRecommendation(user,N)
for item,puiin rank:
if itemin tu:
hit +=1
all +=len(tu)
return hit / (all *1.0)
```
```
def precision(train,test,N):
hit =0
all =0
for userin train.keys():
tu =test[user]
rank = GetRecommendation(user,N)
for item,puiin rank:
if itemin tu:
hit +=1
all +=N
return hit / (all *1.0)
```
除了计算算法的 准确率/召回率 还应计算算法的覆盖率,覆盖率反映了算法发掘长尾的能力,覆盖率越高说明算法更能将长尾中的物品推荐给用户:
覆盖率 Coverage =
(长尾商品就是只那些不热门的商品,它往往代表了一小部分用户的个性化需求,这些不热门的商品数量极其庞大,因此这些长尾商品的总销售额将是一个不可小觑的数字,也许会超过热门商品(即主流商品)带来的销售额)
覆盖率表示最终的推荐列表包含多大比例的物品,如果每个物品都至少被推荐给一个用户,那么覆盖率就是100%,用如下代码计算推荐算法的覆盖率:
```
def Coverage(train,test,N):
recommend_items =set()
all_items =set()
for userin train.keys():
for itemin train[user].keys():
all_items.add(item)
rank = GetRecommendation(user,N)
for item,puiin rank:
recommend_items.add(item)
return len(recommend_items) /(len(all_items) *1.0)
```
最后,还需要评测算法的新颖度,可以采用推荐列表中物品的平均流行度来度量推荐结果的新颖度,如果推荐的物品都很热门,那么表明算法新颖度较低,反之,如果推荐的物品不是很热门的,表明新颖度较高,计算方法如下:
```
def Popularity(train,test,N):
item_popularity =dict()
for user, itemsin train.items():
for itemin items.keys():
if itemnot in item_popularity:
item_popularity[item] =0
item_popularity[item] +=1
ret =0
n =0
for userin train.keys():
rank = GetRecommendation(user,N)
for item,puiin rank:
ret += math.log(1 + item_popularity[item])
n +=1
ret /= n *1.0
return ret
```
推荐系统实践