Notes
检索中常用几种评价指标:
WAP(Weighted mean Average Precision)在 [2] 提出,是 mAP 的扩展,支持多值相似度(multi-level similarity),基于 ACG。对于一个长为 n 的检索序列 V,有: W A P ( q , V ) = 1 ∑ p = 1 n s ( q , V p ) ∑ i = 1 n A C G @ i ( q , V ) ⋅ 1 ( s ( q , V i ) > 0 ) WAP(q, V)=\frac{1}{\sum_{p=1}^ns(q,V_p)}\sum_{i=1}^nACG@i(q,V)\cdot1(s(q,V_i)>0) WAP(q,V)=∑p=1ns(q,Vp)1i=1∑nACG@i(q,V)⋅1(s(q,Vi)>0) 其中 s ( x , y ) = { 1 , x 与 y 相 似 0 , x 与 y 不 相 似 s(x,y)=\begin{cases}1, & x 与 y 相似 \\ 0, & x与y不相似\end{cases} s(x,y)={1,0,x与y相似x与y不相似 即传统 mAP 中用的二值相似度(binary similarity)。算 WAP@k 时,分母可能有两种取法:
- 前 k 个样本中相似样本数
- 所有样本中相似样本数
见 [3] 中 About the Denominator 一节。此处暂时(2020.10.30)采用与 [3] 一样的策略,即只算前 k 个,则 W A P @ k ( q , V ) = 1 ∑ p = 1 k s ( q , V p ) ∑ i = 1 k A C G @ i ( q , V ) ⋅ 1 ( s ( q , V i ) > 0 ) WAP@k(q, V)=\frac{1}{\sum_{p=1}^ks(q,V_p)}\sum_{i=1}^kACG@i(q,V)\cdot1(s(q,V_i)>0) WAP@k(q,V)=∑p=1ks(q,Vp)1i=1∑kACG@i(q,V)⋅1(s(q,Vi)>0)
Code
# import numpy as np
def WAP(Dist, Rel, k=-1):
"""Weighted mean Average Precision"""
n, m = Dist.shape
if (k < 0) or (k > m):
k = m
Gain = Rel
S = (Gain > 0).astype(np.int)
pos = np.arange(k) + 1
Rank = np.argsort(Dist)
_WAP = 0.0
for s, g, rnk in zip(S, Gain, Rank):
# n_rel = s.sum() # 算所有 m 个
_rnk = rnk[:k]
s, g = s[_rnk], g[_rnk]
n_rel = s.sum() # 只算前 k 个
if n_rel > 0:
acg = np.cumsum(g) / pos
_WAP += (acg * s).sum() / n_rel
return _WAP / n