【发布时间】:2018-06-07 22:30:08
【问题描述】:
我正在尝试计算Oxford Building image dataset 上的Average Precision(和Mean Average Precision)。
下面是他们提供的用于计算平均精度的代码。请注意,pos_set 是来自地面实况集的“最佳”和“良好”图像的并集,而 junk_set 是一组不相关的图像。
void OxfordTest::computeAp(std::vector<std::string> &ranked_list){
float old_recall = 0.0;
float old_precision = 1.0;
float ap = 0.0;
size_t intersect_size = 0;
size_t i = 0;
size_t j = 0;
for ( ; i<ranked_list.size(); ++i) {
if(!pos_set.count(ranked_list[i]))
std::cin.get();
}
if (junk_set.count(ranked_list[i])) continue;
if (pos_set.count(ranked_list[i])) intersect_size++;
float recall = intersect_size / (float)pos_set.size();
float precision = intersect_size / (j + 1.0);
ap += (recall - old_recall)*((old_precision + precision)/2.0);
old_recall = recall;
old_precision = precision;
j++;
}
}
这与链接的维基百科页面上给出的概念完全不同。 这些概念之间有什么关联?
我非常确定 Wikipedia 的概念是正确的,因为它与这篇 answer 和 this 文章中给出的概念一致。
我不明白为什么在上面的代码中会报告它:
- 召回,而维基百科的概念仅包括最后一个公式中的精度。
- 即使考虑使用 delta 召回的公式,也没有人谈论 `(old_precision + precision) /2
【问题讨论】:
标签: information-retrieval precision-recall