思路
这道题的目标是计算多个查询结果的平均平均精度(MAP@k)。整个计算过程可以分解为两个主要步骤:
- 为每个查询计算其平均精度(AP@k)。
- 将所有查询的 AP@k 值取算术平均,得到最终的 MAP@k。
下面我们详细拆解每一步的计算逻辑。
P3674.第2题-信息检索与推荐系统
题目内容
在信息检索与推荐系统中,MAP@k 是衡量检索结果整体质量的经典指标。
请你编写一个确定性评估器:给定若干查询 (query) 的检索结果,计算它们在截断位置 k 处的平均平均精度,四舍五入保留 6 位小数。
1.逐查询 Average Precision(AP@k)
对某一查询,已按系统得分从高到低返回文档序列 (d1,..,dm) ,其对应二值相关性 relr∈{0,1}( 1 表示相关)。
AP@k=min(k,R)∑r=1k(Prec(r)× rel r),Prec(r)=r∑t=1rrellt
- R=∑r=1mrelr : 该查询真实相关文档数
- 若 R=0 (该查询没有任何相关文档) 规定 AP@k=0
- 当返回结果不足 k 条时,用现有条目长度替代 k
- MAP @ k
MAP@k=Q1∑q=1QAP@k(q)
其中 Q 为查询总数。
输入描述
单行 JSON:
{
"k":3, //截断位置 k(1≤k≤100)
"queries":[
{
"labels":[1,0,1], //相关性标签1/0,与 scores 等长
"scores":[0.8,0.9,0.7]// 系统得分,分数越大在处理时排序越靠前
},
...
]
}
-
queries 数量 ≥1
-
labels 与 scores 长度相等且 ≥1
-
labels 仅含 0/1;scores 为任意实数
输出描述
仅输出一行:
0.583333
即 MAP@k,四舍五入保留 6 位小数。
样例1
输入
{"k":3,"queries":[{"labels":[1,0,0],"scores":[0.9,0.8,0.7]},{"labels":[0,1,0],"scores":[0.9,0.8,0.7]}]}
输出
0.750000