NDCG(归一化折损累计增益)

NDCG是推荐系统中衡量top-k推荐效果的指标,考虑了物品相关性和位置权重。Gain表示物品相关性,CG为累计收益,DCG引入位置折损因子,IDCG是理想情况下的DCG,而NDCG则是对DCG的归一化,用于不同长度序列的比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

乍一看这个名字有点唬人,其实就是只纸老虎,看完本文肯定有所收获。

NDCG可作为推荐系统中top-k推荐的评测指标,顾名思义top-k推荐就是一次给用户推荐k个物品(长度为k的列表[1,2,3, ……,k]),那怎么去评价这个推荐列表的好坏呢?让我们按G-CG-DCG-IDCG-NDCG的顺序一步一步来看。

1. Gain:表示物品的相关性分数,符号为rel_{i},推荐系统中表示推荐给用户的列表中的第i个物品,用户是否喜欢(喜欢为1,不喜欢为0)。

2. Cumulative Gain(CG):对列表中的所有物品i的收益进行累加,符号表示为CG = \sum_{i=1}^{k}rel_{i}。这个很好理解,就是推荐给用户的列表中用户喜欢的物品的总数量,这只有数量上的意义,但其实序列中各物品排列的顺序顺序的不同,对用户的偏好也是存在影响的,所以就有了接下来的指标。

3.Discounted  Cumulative Gain(DCG):DCG考虑了位置因素,为每一个rel_{i}都添加了一个折损值,公式如下所示。注意DCG只是简单的累加,只能用于同等长度的序列之间的比较,毕竟列表越长不一定越好是不是。

        DCG = \sum_{i=1}^{k}\frac{rel_{i}}{log_{2}(i+1))}

可见物品在列表中位置越靠前,折损值越小;越靠后,折损值越大。

4. IDCG:DCG的一种特例,物品i在列表中按rel_{i}从大到小排列即DCG最大的情况。

5. NDCG(归一化折损累计增益):用IDCG对DCG做归一化,可用于不同长度序列之间的比较。同等长度序列之间比较,也可以实现去量纲。

       NDCG = \frac{DCG}{IDCG}

### NDCG 计算方法 为了衡量返回文档列表的质量,可以采用归一化折损累积增益 (Normalized Discounted Cumulative Gain, NDCG),这是一种广泛应用于信息检索和推荐系统的评估指标。该度量考虑了排名位置的影响以及各个项目的相关性得分。 假设有一个查询对应的理想排序结果为 `[A, B, C]` 并且已知各项目的真实相关程度分别为 `rel(A)=3`, `rel(B)=2`, 和 `rel(C)=1`。如果系统给出的实际排序结果是 `[B, A, C]` 或者其他顺序,则可以通过下面的方法来计算其 DCG 值: #### 折损累积增益(Discounted Cumulative Gain) 对于给定的一个查询 q 的第 i 位上的文档 d_i ,定义其贡献值为: \[ \text{gain}(d_{i})=\left\{\begin{array}{ll} 2^{\operatorname{rel}\left(d_{i}\right)}-1 & , \mathrm{i}>0 \\ \operatorname{rel}\left(d_{i}\right) & , \mathrm{i}=0 \end{array}\right.\] 其中 rel(di) 表示文档 di 对于当前查询的相关等级[^3]。 因此,在位置 k 处的累计收益可表示为: \[ \mathrm{DCG}_{k}=\sum_{i=1}^{k} \frac{\text { gain }(d_{i})}{\log _{2}(i+1)} \] 这里引入了一个对数函数作为折扣因子,用来惩罚那些排在较后的高分项;同时保证即使两个序列中有相同的元素集合,只要它们的位置不同也会得到不同的评分。 #### 归一化折损累积增益NDCG) 由于实际应用中的最优排列通常是未知的,所以需要先求得理论最大可能达到的最佳情况下的 DCG 即 Ideal DCG(IDCG): \[ \mathrm{IDCG}_k = \max (\mathrm{DCG_k}) \] 最后通过将原始 DCG 除以 IDCG 来获得标准化的结果 —— 这就是所谓的 NDCG : \[ \mathrm{NDCG}_k = \frac{\mathrm{DCG}_k } {\mathrm{IDCG}_k }\] 这样做的好处是可以让不同长度或规模的数据集之间具有可比性,并且使得最终得分范围固定在 [0, 1] 内,便于直观理解。 ```python import math def dcg_at_k(r, k): """Compute the discounted cumulative gain at rank position k.""" r = r[:k] return sum((2**relevance - 1) / math.log(i + 2, 2) for i, relevance in enumerate(r)) def ndcg_at_k(r, k): """Compute Normalized Discounted Cumulative Gain (nDCG).""" idcg = dcg_at_k(sorted(r, reverse=True), k) if not idcg: return 0. return dcg_at_k(r, k) / idcg # Example usage with a list of relevances scores from most relevant to least relevances_scores_example = [3, 2, 3, 0, 1, 2] print(f"NDCG@5: {ndcg_at_k(relevances_scores_example, 5):.4f}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值