swuxyj / DeepHash-pytorch

Implementation of Some Deep Hash Algorithms, Including DPSH、DSH、DHN、HashNet、DSDH、DTSH、DFH、GreedyHash、CSQ.
MIT License
495 stars 116 forks source link

关于计算 mAP@K 的一个问题 #33

Open fuchun-wang opened 2 years ago

fuchun-wang commented 2 years ago

拿计算mAP@3为例,

case1: [+ - +] AP@3= (1 + 2/3) / 2 = 5/6 case2: [+ - - ] AP@3 = (1) / 1 = 1

有两个case,case1 返回两个正样本,case2 返回一个正样本,但是计算出来的AP@3,case1却低于case2, 这合理吗?

HeanJean commented 2 years ago

这个不是代码的问题,是AP定义自身的问题。 AP指标不适合用于评价hash编码下的检索精度。原因如下: 下面讨论32 bits的hash编码。根据hash编码的hamming距离定义,与某hash编码h_1距离为1的hash码有32个(只有1个bit不一样),记为h_i。 根据AP的定义,AP指标与这32个h_i的排列顺序有关(注意这32个h_i与已知的h_1距离相等)。假设 32个h_i对应的图像中,有16个与h_1对应的查询图完全相似(正样本),有16个与h_1对应的查询图完全不相似(负样本)。现在计算两种极端情况下的32个h_i的AP: (1). 16个正样本全部在前半部分, 16个负样本全部在后半部分。 在这种序列排列下, 其对应的AP值为15,计算公式为前半部分都是1,后半部分都是0(后半部分的示性函数都为0)。(2). 16个负样本都在前半部分,16个正样本都在后半部分。在这种序列排列下,其对应的AP值 = 1/16 + 2 / 17 + ...+ 15/30 = 13.85.

通过上面的例子可以看到,对于同样的查询结果,仅仅因为 返回序列的排列方式不一样,就会导致AP指标不一样。

HeanJean commented 2 years ago

更正一下: (2). 16个负样本都在前半部分,16个正样本都在后半部分。在这种序列排列下,其对应的AP值 = 1/16 + 2 / 17 + ...+ 15/30 = 4.35.