【问题标题】:What is the correct version of Average precision?什么是平均精度的正确版本?
【发布时间】: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 的概念是正确的,因为它与这篇 answerthis 文章中给出的概念一致。

我不明白为什么在上面的代码中会报告它:

  1. 召回,而维基百科的概念仅包括最后一个公式中的精度。
  2. 即使考虑使用 delta 召回的公式,也没有人谈论 `(old_precision + precision) /2

This is the C++ original code.

【问题讨论】:

    标签: information-retrieval precision-recall


    【解决方案1】:

    垃圾集

    原论文指出:

    (3) Junk – less than 25% of the object
    is visible, or there is a very high level of occlusion or distortion.
    (4) Absent – the object is not present
    

    即垃圾图片不是底片。有正面(OK+Good)、忽略(Junk)和负面(Absent)。请注意,所有这些都是 per-query,即查询 1 的某些图像是垃圾,但查询 15 的图像不是。如果您查看“垃圾”图像,您会看到模棱两可的示例,例如某些情况下会出现极端缩放或模糊,这会让您思考此图像是否包含查询的地标,以及仅可见对象的一小部分因此图像太硬的情况。

    In computing the average precision, we use the Good and
    Ok images as positive examples of the landmark in question,
    Absent images as negative examples and Junk images
    as null examples. These null examples are treated as though
    they are not present in the database – our score is unaffected
    whether they are returned or not.
    

    因此作者将垃圾集定义为既不是正面也不是负面的 - 图像最有可能描绘了查询的对象,但对于其中一些我们不确定,或者将它们视为正面并询问系统来检索这些示例(如果没有,则惩罚)。同时,如果系统确实检索它们,将它们视为底片也很苛刻,不应该受到惩罚。因此,需要做的就是(在每个查询的基础上)忽略垃圾并将它们视为不存在。因此,您获取检索到的列表,过滤掉此查询的所有垃圾图像,然后在此过滤后的列表上运行正常的 AP 计算。这就是代码正在有效地做的事情——当示例在 amb(=junk) 中时,它只是被跳过。然后,如果示例不在 amb 中,如果它在 pos(itives) 中,则 intersect_size(直到位置 i 的当前正数)递增。数量 j(嗯,j-1)是列表中未跳过元素的数量(仅当当前元素不是垃圾时才会增加)。

    AP 计算

    正如 shiri 在上一个答案中解释的那样,您当然需要在 AP 计算中进行召回,并且如您的文章中所述,p(r) 是特定召回的精度。思考 AP 的最佳方式不是检查随机公式,而是了解直觉是什么,然后看看公式如何捕捉它,即维基百科一开始所说的:您可以将精度绘制为召回率的函数,而 AP那么就是曲线下的面积。您希望所有召回的精度都很高,因此理想曲线是 p(r)=1,这将使 AP 最大化。

    那么代码在做什么呢?它使用梯形规则计算精确召回曲线下的面积,请参阅this equation on Wikipedia,您会发现它与代码相同。您的 Wikipedia 文章中离散情况的 AP 计算是精度召回曲线下面积(rectangle method)的(常用)更差的近似值。

    【讨论】:

    • 我猜你是被引论文的作者 Relja Arandjelovic。感谢您的回答,它完全阐明了主题! :)
    • 是的,虽然我不是这篇论文的作者,但我后来开始攻读博士学位,但从事相关主题的工作。太好了,我很高兴它澄清了它。
    • 你能看看this的问题吗?
    【解决方案2】:

    召回率绝对与平均精度相关,因为您正在有效地计算在每个可能的召回点的精度。正如您自己注意到的那样,您可以在第一个 Wikipedia 定义中看到这一点。

    还可以在此处找到对 AP 进行清晰解释的良好概述: https://sanchom.wordpress.com/tag/average-precision/

    我先假设这段代码 sn-p 正确计算了 AP,让我们看看这会将我们引向何方。 (这不一定是真的,但考虑到该论文自 2007 年以来已被引用 1800 次,大概如果有错误,现在有人会发现它。)


    维基百科将构成 AP 总和的每个元素定义为:

    P(k) * delta_r(k)

    其中k是检索到的文档序列中的排名,n是检索到的文档数,P(k)是列表中截止k处的精度,delta_r(k)是从k-1项到项的召回率变化k.

    也就是说,这一行……​​

    ap += (recall - old_recall)*((old_precision + precision)/2.0);

    ... 大概是在添加 sum 元素。

    很明显delta_r(k)==(recall - old_recall),所以这部分被覆盖了。

    现在,((old_precision + precision)/2.0) 呢?这也是你所担心的。


    好的。所以。这部分确实很奇怪。它没有使用 P(k)(截止 k 处的精度),显然是平均 P(k)P(k-1)。我由我的实验室伙伴运行这个(我在一个国家认可的 IR 实验室工作),我们无法弄清楚为什么代码会这样做。我的直觉是作者选择做某种形式的平滑,但我不明白为什么。另一种选择是总和以某种方式伸缩,并且这些项目相互抵消。它看起来确实很奇怪。

    编辑:这个“奇怪”的规则显然来自使用 trapeziodal rule 而不是 rectangle rule 来估计曲线下的面积,正如 Relja Arandjelović 在接受的答案中所解释的那样。为了完整起见,在此处添加。


    同时,您可以将此排名函数的结果与trec_eval 交叉引用,看看您得到的结果是相同的还是不同的。

    【讨论】:

    • 感谢您的关注和回答,非常感谢。关于召回,我的意思是根据维基百科上的最后一个公式和其他 2 个链接来源,AP 可以仅使用精度来计算,因此召回并不是绝对必要的。那是对的吗?关于您的同事评论:我更新了问题,包括原始代码的链接(在底部)。查看ground trouth文件,pos_set*_good.txt*_ok.txt文件中所有文件的并集,而junk_set_junk.txt文件中所有图像(待续...)
    • 这意味着有些元素既不在pos_set 也不在junk_set。但我并没有真正意识到他们甚至需要定义junk_set。要定义精度(甚至召回,如果你想使用第一个公式)你只需要pos_set,对吧? :D 再次感谢您的关注,我一定会尝试trec_val! ;)
    • 很高兴我能提供帮助,也很高兴您从比我更了解此内容的人那里得到了有用的答案!
    • P.S.那是trec_eval :)
    猜你喜欢
    • 2010-11-19
    • 2012-11-30
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 2010-09-19
    • 2017-04-15
    • 1970-01-01
    相关资源
    最近更新 更多