这道题的目标是计算多个查询结果的平均平均精度(MAP@k)。整个计算过程可以分解为两个主要步骤:
下面我们详细拆解每一步的计算逻辑。
在信息检索与推荐系统中,MAP@k 是衡量检索结果整体质量的经典指标。
请你编写一个确定性评估器:给定若干查询 (query) 的检索结果,计算它们在截断位置 k 处的平均平均精度,四舍五入保留 6 位小数。
1.逐查询 Average Precision(AP@k)
对某一查询,已按系统得分从高到低返回文档序列 (d1,..,dm) ,其对应二值相关性 relr∈{0,1}( 1 表示相关)。
$\mathrm{AP} @ k=\frac{\sum_{r=1}^{k}(\operatorname{Prec}(r) \times \text { rel } r)}{\min (k, R)}, \quad \operatorname{Prec}(r)=\frac{\sum t=1^{r} \mathrm{rel} l_{t}}{r}$
$\mathrm{MAP} @ k=\frac{1}{Q} \sum_{q=1}^{Q} \mathrm{AP} @ 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 位小数。
输入
{"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