1. 参考链接
https://www.zhihu.com/question/22464082
https://zhuanlan.zhihu.com/p/38875570
https://blog.csdn.net/u014203453/article/details/77598997
https://blog.csdn.net/simple_the_best/article/details/52296608
2. 先来说下 AP (Average Precision)
AP 即为平均准确率,针对的是一个用户的推荐(排序)结果
对于AP可以用这种方式理解: 假使当我们使用google搜索某个关键词,返回了10个结果。当然最好的情况是这10个结果都是我们想要的相关信息。但是假如只有部分是相关的,比如5个,那么这5个结果如果被显示的比较靠前也是一个相对不错的结果。但是如果这个5个相关信息从第6个返回结果才开始出现,那么这种情况便是比较差的。这便是AP所反映的指标,与recall的概念有些类似,不过是“顺序敏感的recall”。
比如对于用户 u, 我们给他推荐一些物品,那么 u 的平均准确率定义为:(ground truth 表示的意思是 【标准答案】)
用一个例子来解释AP的计算过程:
因此该 user 的AP为(1 + 0.66 + 0.5) / 3 = 0.72
def AP(ranked_list, ground_truth):
"""Compute the average precision (AP) of a list of ranked items
ground_truth 表示是否正确的标识
hits 表示 score (预测结果分值)倒排,从第0个到当前个的累计预测正确样本数
sum_precs 表示每个 ground_truth = 1 的位置的 precision 的累加
"""
hits = 0
sum_precs = 0
for n in range(len(ranked_list)):
if ranked_list[n] in ground_truth:
hits += 1
sum_precs += hits / (n + 1.0)
if hits > 0:
return sum_precs / len(ground_truth)
else:
return 0
3. 再来理解 MAP
那么对于MAP(Mean Average Precision),就很容易知道即为所有用户 u 的AP再取均值(mean)而已。那么计算公式如下: