map是图像检索模型的一个评价指标
以图片中第一个计算AP值为例
P的分别是[1, 2/3, 3/6, 4/9, 5/10]
R值分别是[1/5, 2/5, 3/5/, 4/5, 1]
AP计算结果
(1+2/3+3/6+4/9+5/10)/ 5
https://blog.csdn.net/weixin_40100431/article/details/88768479
假设输入一张图片,数据库中有3个图像与之匹配,按照相似度高低进行排序,得到的位置是第1位,第3位,第6位是这三幅图像,匹配正确。
在这里插入代码片
但是在这个程序设计中,待检索图像在当前数据库中,那么本身的相似度肯定是最高的,排在第0位,ranks=[0,1,3,6]
。nres=4。表示数据库中与待检索图像的属于同一类的个数。按照图像检索ap的计算 方式, 得到ap=(1+1+3/4+4/7)/4=0.830357143.但是这种计算方式ap值偏大,自己检索到自己不应该算到里面 ,于是正确的计算方式应该是ap=(1+2/3+3/6)/3=0.7222222。在测试的时候计算之后发现与代码中计算结果不一致。代码中的求取方式是[(1+1+3/4+4/7)/4+(1+2/3+3/6)/3]/2。不是求平均值。
import numpy as np
def compute_ap(ranks, nres):
"""
Computes average precision for given ranked indexes.
Arguments
---------
ranks : zerro-based ranks of positive images
nres : number of positive images
Returns
-------
ap : average precision
"""
# number of images ranked by the system
nimgranks = len(ranks)
# accumulate trapezoids in PR-plot
ap = 0
recall_step = 1. / nres
for j in np.arange(nimgranks):
rank = ranks[j]
if rank == 0:
precision_0 = 1.
else:
precision_0 = float(j) / rank
precision_1 = float(j + 1) / (rank + 1)
ap += (precision_0 + precision_1) * recall_step / 2.
return ap
ranks=np.array([0,1,3,6])
ners=4
result=compute_ap(ranks,ners)
print(result)
0.8110119047619047
import numpy as np
ranks = np.array([1,3,6])
def compute_ap(ranks):
ap = 0
for i,j in enumerate(ranks):
print(i,j)
print((i + 1) / j)
ap += (i + 1) / j
return ap / len(ranks)
ap = compute_ap(ranks)
print("AP:",ap)
0 1
1.0
1 3
0.6666666666666666
2 6
0.5
AP: 0.7222222222222222