Binary(P@k,MAP,MRR)
时间: 2025-07-05 12:10:18 浏览: 6
### 关于二分类评估指标P@k、MAP、MRR的解释
#### P@k (Precision at k)
对于给定查询,返回的结果列表中前$k$项里有多少是相关的。具体来说,在推荐系统或搜索引擎中,如果用户可能只查看前几个结果,则此度量非常重要。
$$ \text{P}@k = \frac{\sum_{i=1}^{k}\mathbb{I}(r_i)} {min(k, R)}, $$
其中$\mathbb{I}$是一个指示函数,当第$i$个文档相关时取值为1;否则为0;而$R$表示实际存在的正样本总数[^1]。
```python
def precision_at_k(relevant_items, retrieved_items, k):
relevant_and_retrieved = set(relevant_items).intersection(set(retrieved_items[:k]))
return len(relevant_and_retrieved) / min(len(retrieved_items), k)
```
#### MAP (Mean Average Precision)
平均精度均值衡量的是在整个排名列表上的表现情况。它考虑到了所有位置上正确检索到的相关项目,并给予早期找到更多权重。对于每个查询$q$:
$$ AP(q)=\frac {\sum _{{n}}(precision(n)\cdot rel(n))}{number\_of\_relevant\_documents}, $$
最终通过求解多个查询下的AP值得到整体性能评价标准——即MAP:
$$ MAP=\frac {{\sum }_{{q}}AP(q)}{|Q|}. $$
这里$n$代表排序后的索引编号,$rel()$判断该条目是否属于目标类别[^2]。
```python
import numpy as np
def mean_average_precision(actuals, predictions):
ap_scores = []
for actual, prediction in zip(actuals, predictions):
sorted_indices = np.argsort(prediction)[::-1]
true_positives = 0
precisions_sum = 0
for i, idx in enumerate(sorted_indices):
if actual[idx]:
true_positives += 1
precisions_sum += true_positives / (i + 1)
if sum(actual) != 0:
ap_scores.append(precisions_sum / sum(actual))
return np.mean(ap_scores)
```
#### MRR (Mean Reciprocal Rank)
倒数第一命中率用于测量首次遇到正确答案的位置。假设有一个查询集$Q$以及对应的第一个正确响应$r_q$所在位次${rank}_q$,那么可以定义如下公式来计算整个系统的MRR得分:
$$ MRR(Q)=\frac {1}{|Q|}\sum _{{q∈Q}}{\frac {1}{{rank}_{q}}}.$$
这意味着越早给出准确答复越好,因为分母会更小从而使得分数更高[^3]。
```python
def reciprocal_rank(true_item, ranked_list):
try:
rank = ranked_list.index(true_item) + 1
return 1.0 / rank
except ValueError:
return 0.0
def mean_reciprocal_rank(ranked_lists, correct_items):
rr_values = [reciprocal_rank(item, lst) for item, lst in zip(correct_items, ranked_lists)]
return sum(rr_values)/len(rr_values)
```
阅读全文
相关推荐









