前言
NDCG(Normalized Discounted Cumulative Gain,归一化折损累积增益)是一种用于信息检索和推荐系统中评估排序质量的度量方法。它主要用于衡量搜索结果或推荐列表的相关性。NDCG 考虑了结果列表中每个项目的相关性,并且根据项目在列表中的位置给予不同的权重,即越靠前的位置,其得分越高。
DCG (Discounted Cumulative Gain)
DCG 是 NDCG 的基础,计算公式如下:
其中 $ rel_i $ 表示第 i 个文档或项目相对于查询的相关性评分,n 是考虑的文档或项目数量。这里的 $ \log_2(1+i) $ 是位置折扣因子,用来降低排名较后的项目对总分的影响。
IDCG (Ideal DCG)
IDCG 是指给定一组文档或项目,在最佳排序情况下所能达到的最大 DCG 值。计算 IDCG 的方式与 DCG 相同,只是需要先将所有项目的相关性评分按照从高到低排序。
NDCG
NDCG 则是通过将实际获得的 DCG 除以理想情况下的 DCG(即 IDCG),来得到一个归一化的分数,范围从 0 到 1。NDCG 计算公式为:
NDCG = 1 表示排序完全正确;NDCG < 1 表示排序存在一定的误差;NDCG 接近 0 表示排序几乎没有任何参考价值。
使用场景
NDCG 广泛应用于搜索引擎、推荐系统等领域,尤其是在需要评估排序效果时。例如,在电子商务网站上推荐商品时,可以使用 NDCG 来评估不同推荐算法的效果,帮助优化用户体验。
注意事项
- NDCG 对于不同长度的结果列表具有较好的适应性,即使列表中的项目数量不固定也能有效比较。
- 在某些情况下,如果列表中没有相关项目,IDCG 可能会等于 0,这时 NDCG 将无法计算。为了避免这种情况,实践中通常会对数据进行预处理或设定默认值。
- NDCG 对于相关性评分的定义非常敏感,因此在应用时需要确保评分标准的一致性和合理性。
归一化折扣累积增益(Normalized Discounted Cumulative Gain, NDCG)是一种常用的评估信息检索和推荐系统性能的指标。NDCG 通过考虑相关性评分的顺序来评估模型的性能。下面是一个具体的例子,展示如何计算 NDCG。
NDCG 的基本概念
- DCG (Discounted Cumulative Gain):累积增益,考虑了相关性评分的顺序。
- IDCG (Ideal DCG):理想情况下的 DCG,即相关性评分最高的项目排在最前面。
- NDCG:归一化的 DCG,通过将 DCG 除以 IDCG 来归一化。
公式
- DCG: 其中 是第 个项目的相关性评分。
- IDCG: 其中 是理想情况下第 个项目的相关性评分。
- NDCG:
示例
假设我们有一个推荐系统的预测结果和真实的相关性评分:
排序位置 | 预测结果 | 真实相关性评分 |
---|---|---|
1 | A | 3 |
2 | B | 2 |
3 | C | 1 |
4 | D | 0 |
计算 DCG
- 第1个位置的相关性评分为 3:
- 第2个位置的相关性评分为 2:
- 第3个位置的相关性评分为 1:
- 第4个位置的相关性评分为 0:
因此,DCG 为:
计算 IDCG
理想情况下,相关性评分最高的项目排在最前面:
排序位置 | 理想结果 | 真实相关性评分 |
---|---|---|
1 | A | 3 |
2 | B | 2 |
3 | C | 1 |
4 | D | 0 |
- 第1个位置的相关性评分为 3:
- 第2个位置的相关性评分为 2:
- 第3个位置的相关性评分为 1:
- 第4个位置的相关性评分为 0:
因此,IDCG 为:
计算 NDCG
Python 实现
import numpy as np
def dcg_at_k(r, k):
r = np.asfarray(r)[:k]
gain = 2 ** r - 1
discounts = np.log2(np.arange(2, r.size + 2))
return np.sum(gain / discounts)
def ndcg_at_k(r, k):
dcg_max = dcg_at_k(sorted(r, reverse=True), k)
if not dcg_max:
return 0.
return dcg_at_k(r, k) / dcg_max
# 示例数据
relevance_scores = [3, 2, 1, 0]
# 计算 NDCG@4
ndcg_4 = ndcg_at_k(relevance_scores, 4)
print(f"NDCG@4: {ndcg_4}")
输出:
NDCG@4: 1.0
解释
- DCG:根据预测结果计算的累积增益。
- IDCG:根据理想排序计算的累积增益。
- NDCG:通过将 DCG 除以 IDCG 来归一化,得到的结果范围在 0 到 1 之间,1 表示完美排序。
希望这个示例和解释能帮助你理解如何计算 NDCG。如果有任何其他问题,请随时提问!
参考
- 信息检索评价指标NDCG、a-NDCG
- https://www.cnblogs.com/by-dream/p/9403984.html