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_precision
和precision
是非负和recall
是非递减的),因此AP值较小。
实际上,出于纯粹计算的原因,您可能希望以合理的数量裁剪列表,例如, 10k,因为AP的变化不大可能会很大,因为precision @ large_number很可能是0,除非你有非常多的正数。
您的困惑可能与某些常用功能(例如VLFeat的vl_pr
)计算精度 - 回忆曲线的方式有关,因为它们假定您已向其提供了整个排名列表,并因此计算出地面上的正数总数通过查看排名列表而不是基本事实本身来确定真相。因此,如果您在裁剪列表上天真地使用vl_pr
,您确实可能会欺骗它,但那将是无效的计算。我同意这个功能的描述不是100%清楚,但是如果你更详细地检查documentation,你会发现它提到了NUMNEGATIVES
和NUMPOSITIVES
,所以如果你给出的是一个不完整的排名表,你应该设置这两个数量让函数知道如何正确计算精度 - 召回曲线/ AP。现在,如果您使用vl_pr
绘制排名列表的不同作物,但对于所有函数调用使用相同的NUMNEGATIVES和NUMPOSITIVES,则您会看到精确回忆曲线只是彼此的作物,正如我上面所解释的(我没有'我没有检查过,因为我没有matlab在这里,但我确定是这种情况,如果不是,我们应该提交一个bug)。
我明白你的答案,再次感谢你一如既往。我正在牛津大厦数据集上测试VLFeat VLAD,因为整个数据集大约是5k图像,我将它们全部作为sorted_list传递给[this](http://www.robots.ox.ac.uk/~vgg/ data/oxbuildings/compute_ap.cpp)code;)一开始我以为我们只需要通过前10名(或类似的)图片作为ranking_list,现在我将通过它们的所有5k!再次感谢! – justHelloWorld