nDCG(normalized Discounted Cumulative Gain,归一化折损累计增益)是一种用于评估推荐系统或搜索引擎性能的指标。它用于度量推荐或检索结果的排名质量,以确定它们是否能够满足用户需求。
nDCG计算推荐或检索系统中前K个物品的累计收益(cumulative gain),并考虑每个物品在排名中的位置和分配给它的相关度分数。然后,将折扣累计收益(discounted cumulative gain,DCG)归一化为理想折扣累计收益(ideal discounted cumulative gain,iDCG),后者表示前K个物品的最佳可能排名。
nDCG的计算公式如下:
nDCG@K = DCG@K / iDCG@K
其中:
DCG@K是推荐或检索系统中前K个物品的折扣累计收益。
iDCG@K是理想折扣累计收益,表示前K个物品的最佳可能排名。
K是考虑的物品数量。
nDCG的取值范围是0到1,1表示推荐或检索物品的排名完美。在信息检索和机器学习应用中,nDCG是一种常用的评价指标,其目标是向用户提供相关和有用的推荐或搜索结果。
下面是用Python实现nDCG的示例代码,其中假设已经有了一个包含真实相关度得分和推荐结果的列表,以及需要计算nDCG的排名长度K:
下面展示一些 内联代码片
。
import numpy as np
def normalize_scores(scores):
"""
使用min-max归一化方法将得分归一化到0到1之间
:param scores: 一个包含得分的列表
:return: 归一化后的得分列表
"""
min_score = min(scores)
max_score = max(scores)
if max_score == min_score:
return [0.5] * len(scores)
return [(s - min_score) / (max_score - min_score) for s in scores]
def ndcg_at_k(true_scores, pred_scores, k):
"""
计算nDCG@k评价指标
:param true_scores: 一个列表,包含真实相关度得分(例如[1, 2, 3, 0, 2])长度为N
:param pred_scores: 一个列表,包含推荐结果的相关度得分(例如[3, 1, 2, 0, 2])长度为N
:param k: 要计算nDCG的排名长度
:return: nDCG@k和排序后的预测相关度得分
"""
# 将真实相关度得分和预测相关度得分归一化到0到1之间
true_scores_norm = normalize_scores(true_scores)
pred_scores_norm = normalize_scores(pred_scores)
# 计算DCG@k
dcg_k = 0
for i in range(k):
dcg_k += (2 ** true_scores_norm[i] - 1) / np.log2(i + 2)
# 注意:这里使用i+2而不是i+1是因为i从0开始,排名从1开始
# 计算IDCG@k
ideal_scores = np.sort(true_scores_norm)[::-1] # 排序真实相关度得分
idcg_k = 0
for i in range(k):
idcg_k += (2 ** ideal_scores[i] - 1) / np.log2(i + 2)
# 如果所有真实相关度得分都是0,则IDCG为0,避免除以0错误
if idcg_k == 0:
return 0, np.sort(pred_scores_norm)[::-1][:k]
# 计算nDCG@k
ndcg_k = dcg_k / idcg_k
# 将预测相关度得分排序,返回排序后的前k个值
pred_scores_sorted = np.sort(pred_scores_norm)[::-1][:k]
return ndcg_k, pred_scores_sorted
true_scores=[2 ,1.6 ,1.8 ,1.7 ,1.75 ,1.78 ,1.7 ,1.6 ,1.7 ,1.5, 1.5 ,1.48 ,1.43 ,1.43 ,1.5 ,1.5 ,1.2 ,1, 0.9]
pred_scores=[1.51 ,1 ,1.36 ,1.17 ,1.16 ,1.17, 1.166, 1.55, 1.161 ,1.01 ,1.05 ,0.96, 0.94, 0.95 ,1.04, 1.67 ,1.27, 1.21, 1.04]
result=ndcg_at_k(true_scores,pred_scores,len(true_scores))
for a in result:
print(a)
最后得分0.98,排序结果较好.
true_scores和pred_scores是计算nDCG评价指标时需要用到的两个参数,它们分别表示真实相关度得分和预测相关度得分。
true_scores:一个包含真实相关度得分的列表,长度为N。在推荐系统中,通常将用户对某个物品的评分视为该物品的真实相关度得分。例如,如果一个用户对一部电影给出了4星评分,则可以将4视为该用户对该电影的真实相关度得分。如果一个用户没有对某个物品进行评分,则可以将该物品的真实相关度得分设置为0或其他值。
pred_scores:一个包含推荐结果的相关度得分的列表,长度也为N。在推荐系统中,通常将推荐算法给出的某个物品的得分或分数视为该物品的预测相关度得分。例如,如果推荐算法给出了一部电影的得分为3.5,则可以将3.5视为该电影的预测相关度得分。
通常情况下,真实相关度得分和预测相关度得分都是在0到1之间的浮点数。在计算nDCG评价指标时,需要对它们进行归一化,以使它们具有可比性。可以使用min-max归一化或其他归一化方法对它们进行归一化。
数据样式