Notes

检索中常用几种评价指标:

  • mAP(@R)
  • Precision-Recall Curve
  • Precision@top-R Curve
  • NDCG(@R)
  • ACG(@R)
  • WAP(@R)

NDCG(Normalized Discounted Cumulative Gains)相比 mAP 的一个特点是支持多值的相似性(multi-level similarity),而 mAP 只是二值的:相似或不相似。这种特性在涉及 multi-label 数据的检索时显得更加合理。
mAP 有一种扩展是 WAP(Weighted mAP)[2],基于 ACG(Average Cumulative Gains)[3],支持多值相似性。
对于查询样本 q,检索序列为 V,DCG 公式:DCG@k(q,V)=∑i=1kG[rel(q,i)]⋅D(i)DCG@k(q, V)=\sum_{i=1}^kG[rel(q,i)]\cdot D(i)DCG@k(q,V)=i=1∑k​G[rel(q,i)]⋅D(i) 其中:

  • rel(q,i)\text{rel}(q,i)rel(q,i) 表示第 i 个检索数据与查询数据之间的相似性,可以多值,如定义成 q 和第 i 个数据之间共同标签数:rel(q,i)=lqTlirel(q,i)=l_q^Tl_irel(q,i)=lqT​li​;
  • G(⋅)G(\cdot)G(⋅) 是 gain 函数,一般取 G(x)=2x−1G(x)=2^x-1G(x)=2x−1;
  • D(⋅)D(\cdot)D(⋅) 是 discount 函数,与位置有关,一般取 D(i)=log⁡2(1+i)D(i)=\log_2(1+i)D(i)=log2​(1+i)。

即 DCG@k(q,V)=∑i=1k2rel(q,i)−1log⁡2(1+i)DCG@k(q, V)=\sum_{i=1}^k\frac{2^{rel(q,i)}-1}{\log_2(1+i)}DCG@k(q,V)=i=1∑k​log2​(1+i)2rel(q,i)−1​ 若对于 q,最优的检索序列为 III,则 NDCG@k 为:NDCG@k(q)=DCG@k(q,V)DCG@k(q,I)NDCG@k(q)=\frac{DCG@k(q,V)}{DCG@k(q,I)}NDCG@k(q)=DCG@k(q,I)DCG@k(q,V)​ 易知,上限为 1。
当距离为 hamming 距离时,应用 tie-aware 版本的指标,见 tie-aware的检索指标。

Code

# import numpy as npdef cos(A, B=None):"""cosine"""An = normalize(A, norm='l2', axis=1)if (B is None) or (B is A):return np.dot(An, An.T)Bn = normalize(B, norm='l2', axis=1)return np.dot(An, Bn.T)def hamming(A, B=None):"""A, B: [None, bit]elements in {-1, 1}"""if B is None: B = Abit = A.shape[1]return (bit - A.dot(B.T)) // 2def euclidean(A, B=None, sqrt=False):aTb = np.dot(A, B.T)if (B is None) or (B is A):aTa = np.diag(aTb)bTb = aTaelse:aTa = np.diag(np.dot(A, A.T))bTb = np.diag(np.dot(B, B.T))D = aTa[:, np.newaxis] - 2.0 * aTb + bTb[np.newaxis, :]if sqrt:D = np.sqrt(D)return Ddef sim_mat(label, label_2=None, sparse=False):if label_2 is None:label_2 = labelif sparse:S = label[:, np.newaxis] == label_2[np.newaxis, :]else:S = np.dot(label, label_2.T) > 0return S.astype(label.dtype)def NDCG(qF, rF, qL, rL, what=0, k=-1, sparse=False):"""Normalized Discounted Cumulative Gainref: https://github.com/kunhe/TALR/blob/master/%2Beval/NDCG.m"""n_query = qF.shape[0]if (k < 0) or (k > rF.shape[0]):k = rF.shape[0]Rel = np.dot(qL, rL.T).astype(np.int)G = 2 ** Rel - 1D = np.log2(2 + np.arange(k))if what == 0:Rank = np.argsort(1 - cos(qF, rF))elif what == 1:Rank = np.argsort(hamming(qF, rF))elif what == 2:Rank = np.argsort(euclidean(qF, rF))_NDCG = 0for g, rnk in zip(G, Rank):dcg_best = (np.sort(g)[::-1][:k] / D).sum()if dcg_best > 0:dcg = (g[rnk[:k]] / D).sum()_NDCG += dcg / dcg_bestreturn _NDCG / n_query

multiple RRR

  • multi_nDCG,支持单个或多个 position thresholds,传 int 或 int tuple/list。
# import copy
# import numpy as np
# from util import *  # `euclidean` 放在这里面def nDCG(Dist, Rel, k=-1):"""单 k 版即原 NDCG(见前文),只是换了 API,用来对拍"""n, m = Dist.shapeif (k < 0) or (k > m):k = mG = 2 ** Rel - 1D = np.log2(2 + np.arange(k))Rank = np.argsort(Dist)_NDCG = 0for g, rnk in zip(G, Rank):dcg_best = (np.sort(g)[::-1][:k] / D).sum()if dcg_best > 0:dcg = (g[rnk[:k]] / D).sum()_NDCG += dcg / dcg_bestreturn _NDCG / ndef multi_nDCG(Dist, Rel, k=-1):"""支持单 k、多 k多个 k 时传 int tuple/list"""if isinstance(k, int):k = [k]else:k = copy.deepcopy(k)n, m = Dist.shapefor kid in range(len(k)):if (k[kid] < 0) or (k[kid] > m):k[kid] = mk = sorted(k)  # ascendingassert k[0] != 0, "`@0` is meaningless and disallowed for efficiency"G = 2 ** Rel - 1# D = np.log2(2 + np.arange(k))D = np.log2(2 + np.arange(m))Rank = np.argsort(Dist)_nDCG = np.zeros([len(k)], dtype=np.float32)for g, d, rnk in zip(G, D, Rank):# dcg_best = (np.sort(g)[::-1][:k] / D).sum()g_desc = np.sort(g)[::-1]if 0 == g_desc[0]:  # biggist DCGcontinuedcg_best_list = (g_desc / D).cumsum()# if dcg_best > 0:#     dcg = (g[rnk[:k]] / D).sum()#     _NDCG += dcg / dcg_bestg_sort = g[rnk]dcg_list = (g_sort / D).cumsum()for kid, _k in enumerate(k):dcg = dcg_list[_k - 1]_nDCG[kid] += dcg / dcg_best_list[_k - 1]_nDCG /= nif 1 == _nDCG.shape[0]:_nDCG = _nDCG[0]return _nDCGif __name__ == "__main__":print("对拍。结论:一致")N, M = 5, 20qF = np.random.randn(N, 3)rF = np.random.randn(M, 3)qL = np.random.randint(0, 2, size=(N, 7))rL = np.random.randint(0, 2, size=(M, 7))D = euclidean(qF, rF)S = sim_mat(qL, rL)k_list = [1] + list(range(0, M + 1, 5)[1:])print("k_list:", k_list)ndcg1 = [nDCG(D, S, k=_k) for _k in k_list]ndcg2 = multi_nDCG(D, S, k_list)print("nDCG 1:", ndcg1)print("nDCG 2:", ndcg2)

References

  1. Discounted cumulative gain
  2. Deep semantic ranking based hashing for multi-label image retrieval
  3. IR evaluation methods for retrieving highly relevant documents
  4. TALR/+eval/NDCG.m
  5. tie-aware的检索指标
  6. iTomxy/ml-template/evaluate/_nDCG.py

NDCG(@R)指标相关推荐

  1. 理解NDCG排序指标

    理解NDCG排序指标 关于NDCG,wiki给点解释很详细,这里我谈谈我的理解. NDCG(Normalized discounted cumulative gain):是用来衡量排序质量的指标. 其 ...

  2. 24个基本指标精粹讲解(3)--W%R

    威廉指标--W%R 威廉指标W%R又叫威廉超买超卖指标,简称威廉指标,是由拉瑞?威廉(Larry William)在1973年发明的,是目前股市技术分析中比较常用的短期研判指标. 第一节 W%R指标的 ...

  3. 24个基本指标精粹讲解(3)--WR

    威廉指标--WR 威廉指标W%R又叫威廉超买超卖指标,简称威廉指标,是由拉瑞?威廉(Larry William)在1973年发明的,是目前股市技术分析中比较常用的短期研判指标. 第一节 W%R指标的原 ...

  4. 独立性权重指标怎么计算?

    一.应用 独立性权重法是一种客观赋权法.其思想在于利用指标之间的共线性强弱来确定权重.如果说某指标与其它指标的相关性很强,说明信息有着较大的重叠,意味着该指标的权重会比较低,反之如果说某指标与其它指标 ...

  5. 威廉指标WR计算公式

    威廉指标WR计算公式 威廉指标的计算主要是利用分析周期内的最高价.最低价及周期结束的收盘价等三者之间的关系展开的.以日威廉指标为例,其计算公式为: WR=(Hn-C)÷(Hn-Ln)×100 其中:C ...

  6. 谈谈准确率(P值)、召回率(R值)及F值

    转载自  谈谈准确率(P值).召回率(R值)及F值 谈谈准确率(P值).召回率(R值)及F值 一直总是听说过这几个词,但是很容易记混,在这里记录一下.希望对大家理解有帮助. 首先来做一个总结: 准确率 ...

  7. 推荐系统评测指标—准确率(Precision)、召回率(Recall)、F值(F-Measure)

     下面简单列举几种常用的推荐系统评测指标: 1.准确率与召回率(Precision & Recall) 准确率和召回率是广泛用于信息检索和统计学分类领域的两个度量值,用来评价结果的质量.其 ...

  8. 准确率(P值)、召回率(R值)、及F值

    准确率(P值)是针对我们预测结果而言的,它表示的是预测为正的样本中有多少是真正的正样本. 召回率(R值)是针对我们原来的样本而言的,它表示的是样本中的正例有多少被预测正确了. 假如我此时想吃香蕉,实验 ...

  9. 自然语言处理:分词评测指标——准确率(Precision)、召回率(Recall)、F值(F-Measure)

    下面简单列举几种常用的推荐系统评测指标: 1.准确率与召回率(Precision & Recall) 准确率和召回率是广泛用于信息检索和统计学分类领域的两个度量值,用来评价结果的质量.其中精度 ...

最新文章

  1. SAP MM UB类型的退货STO流程简述
  2. mysql接口测试_用python实现接口测试(四、操作MySQL)
  3. android获取文件上级目录,Android 文件存储
  4. Win10系统的SurfacePro4如何重装系统-3 重装完成之后的系统优化
  5. ai中如何插入签名_技巧不求人167期 Excel如何打印到1页纸的2种方法 Excel如何插入手写签名...
  6. VirtualBox的Linux虚拟机访问Windows7的文件
  7. MySql 应用语句
  8. Physics-based Animation 相关
  9. 二进制 文件 读入_数据挖掘--SPSS?Modeler数据的读入
  10. (三十六)让常量只读——const限定符
  11. python 直线检测_python hough变换检测直线的实现方法
  12. 职称计算机 将计算机broad_1下的e盘映射为k盘网络驱动器,计算机职称考试题目(网络基础答案)...
  13. 【编译原理】递归下降语法分析设计原理与实现
  14. AE-after Effects 笔记
  15. 大妈也能看懂的大数据分布式计算图解
  16. Excel VLOOKUP实用教程之 08 VLOOKUP如果实现区分大小写的查找?(教程含数据excel)
  17. Python文件读写模式与光标的移动
  18. 得到app文稿导出_逻辑思维,阅读付费平台“得到APP”功能分析
  19. Coherence X for mac(网站转换为mac应用的工具)
  20. python账号_基于Python打造账号共享浏览器功能

热门文章

  1. 关于计算机的作文论文怎么写,怎么写关于介绍电脑的作文
  2. Apache配置文件分析
  3. [爬虫] 爬取高德地图的面状数据存为shp - 公园数据为例
  4. Python实用工具,fuzzywuzzy模块,Python实现鲁迅名言查询系统
  5. 国产Linux发行版系统再添一员,颜值完全不输苹果
  6. php 1 099,php099房屋销售管理系统
  7. Iterator迭代器与foreach循环
  8. SolidWorks 标注怎样设置文字沿引线上下分布
  9. 代码混淆的原理是什么?常见代码混淆方法介绍
  10. 乘风破浪会有时,华为云帆济沧海