前言

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 的基本概念

  1. DCG (Discounted Cumulative Gain):累积增益,考虑了相关性评分的顺序。
  2. IDCG (Ideal DCG):理想情况下的 DCG,即相关性评分最高的项目排在最前面。
  3. NDCG:归一化的 DCG,通过将 DCG 除以 IDCG 来归一化。

公式

  • DCG 其中 是第 个项目的相关性评分。
  • IDCG 其中 是理想情况下第 个项目的相关性评分。
  • NDCG

示例

假设我们有一个推荐系统的预测结果和真实的相关性评分:

排序位置 预测结果 真实相关性评分
1 A 3
2 B 2
3 C 1
4 D 0

计算 DCG

  1. 第1个位置的相关性评分为 3:
  2. 第2个位置的相关性评分为 2:
  3. 第3个位置的相关性评分为 1:
  4. 第4个位置的相关性评分为 0:

因此,DCG 为:

计算 IDCG

理想情况下,相关性评分最高的项目排在最前面:

排序位置 理想结果 真实相关性评分
1 A 3
2 B 2
3 C 1
4 D 0
  1. 第1个位置的相关性评分为 3:
  2. 第2个位置的相关性评分为 2:
  3. 第3个位置的相关性评分为 1:
  4. 第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。如果有任何其他问题,请随时提问!

参考