this问题中,我要求对精度调用曲线进行澄清。

特别是,我问我们是否必须考虑一定数量的排名才能画出曲线,还是我们可以合理地选择自己。根据answer,第二个是正确的。

但是,现在我对平均精度(AP)值存有很大的疑问:使用AP可以从数字上估计在给定查询的情况下我们的算法的性能。平均平均精度(MAP)是多个查询的平均精度。

我的疑问是:如果AP根据我们检索的对象数而变化,那么我们可以调整此参数以达到我们的优势,从而显示出可能的最佳AP值。例如,假设p-r曲线表现出色,直到10个元素,然后可怕的是,我们可以仅考虑前10个元素来“欺骗”计算(M)AP值。

我知道这听起来可能令人困惑,但是我在任何地方都没有找到任何有关此的信息。

最佳答案

AP是精确调用曲线下的区域,并且精确调用曲线应该在整个返回的排序列表上进行计算。

不可能通过调整返回的排名列表的大小来欺骗AP。 AP是精确召回曲线下方的区域,该区域绘制了精确度与召回率的函数关系,其中召回率是相对于地面真理中存在的正向总数的返回正数的数量,而不是相对于地面真理中存在的正向总数的数。返回列表。因此,如果裁剪列表,那么您所做的就是裁剪精度调用曲线,而忽略绘制其尾部。由于AP是曲线下的面积,因此剪裁列表会减小AP,因此调整排序的列表大小没有任何意义-如果返回整个列表,则会获得最大的AP。例如,您可以从the code you cited in your other question看到此内容-裁剪列表仅对应于

for ( ; i<ranked_list.size(); ++i) {

更改为
for ( ; i<some_number; ++i) {

这会导致ap的增量较少(所有增量均为负数,因为old_precisionprecision均为非负数,而recall则不减数),因此AP值较小。

实际上,出于纯粹的计算原因,您可能希望将列表裁剪为某个合理的数字,例如10k,因为AP不太可能发生太大变化,因为precision @ large_number可能为0,除非您有非常多的正数。

您的困惑可能与某些流行函数的方式有关,例如VLFeat的vl_pr计算精确召回曲线,因为它们假定您已为它们提供了整个排名列表,因此只需看一下就可以算出地面真相中的正数总数而不是基本事实本身。因此,如果您在裁剪列表上天真地使用vl_pr,则确实可以作弊,但这将是无效的计算。我同意从函数的描述中不能百分百清楚,但是如果您更详细地检查documentation,您会看到它提到了NUMNEGATIVESNUMPOSITIVES,因此,如果要给出不完整的排名列表,则应设置这两个数量让函数知道如何正确计算精确调用曲线/AP。现在,如果您使用vl_pr绘制排名列表的不同裁剪,但所有函数调用都具有相同的NUMNEGATIVES和NUMPOSITIVES,您将看到精确调用曲线相互之间都是裁剪,正如我在上文中所解释的那样(我没有尚未对此进行检查,因为我在这里没有matlab,但我敢肯定是这种情况,如果不是,我们应该提交一个错误)。

关于mean - 关于(平均)平均精度的困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40906671/

10-13 03:13