Mean Average Precision

mean average precision简称mAP,以前一直不懂什么意思,现在写篇博客记录一下。

Precision

我们先来讨论一下,Precision是怎么算的。假如我们有2000个样本,1000正样本,1000个负样本。我们用某个方法进行分类,标记出来300个样本是正样本。现在,我们知道,任何分类方法都不会有百分之百的正确率。所以标记出来的300个分类的样本里,肯定有被分错的样本。假如100个正样本,200个负样本,也就是说,这个分类方法把200个负样本给当成正样本给分类了。那么Precision就是100/300 = 66%。也就是检测出来的正样本数/检测出来的总数。

Recall

Recall和Precision十分类似,还是上面的例子,Recall是检测出来的正样本数/所有正样本个数,这个例子中,所有正样本的个数为1000。所以Recall = 100/1000 = 10%

mAP

有了这两个概念,我们就可以介绍mAP的概念了。

我们来举一个新的例子。
假设有一个搜索引擎,根据搜索引擎,有如下结果:

搜索1相关的样本总共有5个: 正,正,正,正,正
Rank1   正,负,正,负,负,正,负,负,正,正
Recall    0.2,0.2,0.4,0.4,0.4,0.6,0.6,0.6,0.8,1.0
Precision 1.0,0.5,0.66,0.5,0.4,0.5,0.42,0.38,0.44,0.5
Precision从左到右1.0/1, 1/2, 2/3, 2/4以此类推    

搜索2相关样本总共有3个,以下是搜索引擎返回的结果
Rank2 正,负,负,正,正,负,负
Recall 0.33,0.33,0.33,0.66,1,1,1
Precision 1.0,0.5,0.33,0.5,0.6,0.5,0.4

我们把每个正样本所对应的Precision求平均
搜索1的mAP: mAP = (1 + 0.6

### Mean Average Precision (mAP) 的定义 Mean Average Precision (mAP) 是一种广泛用于评估信息检索系统和目标检测模型性能的度量标准。该指标综合考虑了查准率(Precision) 和查全率(Recall),能够更全面地反映系统的整体表现。 在信息检索领域,mAP 表示的是所有查询平均精度的均值[^3]。对于每一个单独的查询请求而言,先计算其对应的 AP 值(Average Precision),再取这些 AP 值的算术平均即得到最终的 mAP 结果。 而在对象检测任务中,mAP 则衡量不同类别上预测框与真实标注框之间的匹配程度。具体来说,针对每一类物体分别统计 TP(True Positive), FP(False Positive) 及 FN(False Negative)[^1]。 ### 计算方法 #### 对于信息检索: 1. 针对单个查询 q,按照文档的相关性得分排序; 2. 根据实际相关情况标记每个返回项是否为正样本; 3. 使用下列公式逐个位置 i 更新当前累计 P@i(Precision at position i),其中 rel(i)=1 若第 i 位是相关项目,否则为0;nrel(q)表示查询q下的总相关数: \[ \text{P}(i|q) = \frac{\sum_{j=1}^{i}\mathrm{rel(j)}}{i},\quad \forall i : \mathrm{rel}(i)=1 \] 4. 将上述过程中获得的所有非零 P@i 平均化作为此查询 Q 下的 AP 值; 5. 最终通过求解所有测试集中各查询下 AP 的简单平均值得到整个数据集上的 mAP。 #### 对象检测中的实现方式略有差异: - 主要区别在于如何判断两个边界框之间是否存在重叠以及设定 IoU(Intersection over Union)阈值来决定真阳性和假阳性。 - 当前普遍采用 COCO 数据集所使用的评价方案,在多个不同的 IoU 阈值水平上来累积 PR 曲线并据此得出每种类别的 AP 后再次做平均形成全局 mAP 指标。 ```python def calculate_map(precisions, recalls): """ Calculate mean average precision given lists of precisions and recalls. Args: precisions (list): List containing precision values. recalls (list): List containing recall values. Returns: float: Calculated MAP value. """ aps = [] unique_recalls = sorted(set(recalls)) for r in unique_recalls: p_interpolated = max([p for p, rec in zip(precisions, recalls) if rec >= r], default=0) aps.append(p_interpolated) return sum(aps)/len(unique_recalls) if len(unique_recalls)>0 else 0 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值