Notes
检索中常用几种评价指标:
ACG(Average Cumulative Gain)支持多值相似度(multi-level similarity)。对于一个检索序列 V,其每个位置的 gain 就是该位置样本与 query 的相似度,例如共同标签数: G ( q , V i ) = l q T l i G(q, V_i)=l_q^Tl_i G(q,Vi)=lqTli 其中 l x l_x lx 是 x 样本的 label 向量。也可以换成 Jaccard 相似度之类的,如 [3]。CG@k 就是前 k 个位置的 gain 总和(cumulative gain): C G @ k ( q , V ) = ∑ i = 1 k G ( q , V i ) CG@k(q, V)=\sum_{i=1}^kG(q,V_i) CG@k(q,V)=i=1∑kG(q,Vi) ACG@k 就是 CG@k 对位置求平均: A C G @ k ( q , V ) = 1 k ∑ i = 1 k G ( q , V i ) ACG@k(q,V)=\frac{1}{k}\sum_{i=1}^kG(q,V_i) ACG@k(q,V)=k1i=1∑kG(q,Vi) ACG@ALL 好像没有什么意义,因为无论什么排序值都是一样的,配合阈值 k 才有点东西。
Code
# import numpy as np
def ACG(Dist, Rel, k=-1):
"""Average Cumulative Gains"""
n, m = Dist.shape
if (k < 0) or (k > m):
k = m
Gain = Rel
Rank = np.argsort(Dist)
_ACG = 0
for g, rnk in zip(Gain, Rank):
_ACG += g[rnk[:k]].mean()
return _ACG / n