nDCG学习笔记

参考:http://en.wikipedia.org/wiki/Discounted_cumulative_gain

Normalized Discounted Cumulative Gain:一种对搜索引擎或相关程序有效性的度量。

2个假设:

    1.强相关的文档出现在结果列表越靠前(rank越高)越有用。

    2.强相关文档比弱相关文档有用,比不相关文档有用。

DCG来源于一个更早的、更基础的方法---CG。

CG不考虑结果集中的序信息,单纯把分级相关度相加。位置P处的CG值是:

                   

是搜索结果列表的位置i处结果的分级相关度。

改变搜索结果的位置顺序不会影响p的CG值。也就是说:移动一个相关性高的文档d_{i}到一个评级较高但相关性不大的文档上面不改变CG的值。

DCG取代CG作为一个更准确的测量方法。

 如果一个强相关的文档排名靠后则应该受到惩罚,位置P处的DCG值是:

             

另一个DCG计算公式更加强调相关性

 

若分级相关度只在0和1取二值的话,二公式效果相同

nDCG

根据Query的不同,结果列表的长度也不同,所以这一度量考虑了正规化问题

IDCGp(Ideal DCG)是在一个完美的排序下,p所具有的最大DCG值

这样一来无论Query是什么,nDCG都可以得到一个平均值,因此不同的Query之间的效能就可以做比较了。

完美的排序算法会使DCGp和IDCGp相同,从而使nDCGp为1,nDCG的取值在0到1之间

例:

结果列表中的6篇文档D1,D2,D3,D4,D5,D6,判定了他们的相关度是3,2,3,0,1,2,则:

                    

一个理想的排序应该是:3,3,2,2,1,0,所以

             

nDCG的缺点是:当排序的数很少(比如:只有1-3个),那么任何排序的nDCG值都比较接近,所以可以考虑使用AUC(area under the ROC curve)。

AUC学习参考文章:http://blog.youkuaiyun.com/chjjunking/article/details/5933105 

 

<think>嗯,用户想了解NDCG的相关概念实现方法。首先,我需要确定NDCG的全称基本定义。NDCG是Normalized Discounted Cumulative Gain的缩写,中文翻译为归一化折扣累积增益。这是信息检索推荐系统中常用的评估指标,用于衡量排序结果的质量。 接下来,我需要解释清楚DCG(折扣累积增益),因为NDCG是基于它的标准化。DCG的核心思想是,高相关性的结果排在前面应该获得更高的分数,并且对每个位置的增益进行折扣,越靠后的位置折扣越大。这里可能需要数学公式,根据用户的系统级指令,行内公式用$...$,独立公式用$$...$$。所以DCG的计算公式应该是这样的:$$DCG@K = \sum_{i=1}^K \frac{rel_i}{\log_2(i+1)}$$其中,$rel_i$表示第i个位置的相关性得分。 然后,归一化的部分需要解释IDCG(理想折扣累积增益),也就是将所有结果按相关性从高到低排序后计算的DCG。NDCG就是DCG除以IDCG,这样结果会被归一化到01之间。公式就是:$$NDCG@K = \frac{DCG@K}{IDCG@K}$$ 用户可能还想知道具体的实现步骤,所以需要分步骤说明。比如,如何计算相关性得分,如何排序,计算折扣因子,累计增益,归一化处理等。同时,用户提到需要生成相关问题,可能需要考虑NDCG其他指标的区别,比如准确率、召回率的比较,或者在不同推荐系统中的应用。 然后,查看用户提供的引用,特别是引用[1]引用[3],里面提到了NDCG作为评估指标。引用[3]中还提到在实验中NDCG@K的表现,所以可能需要引用这些内容来支持解释。例如,在解释NDCG的应用场景时,可以提到在知识图谱卷积网络(KGCN)去噪自动编码器(DAE)集成的推荐模型中,NDCG@K被用来评估性能提升[^3]。 另外,用户可能关心实现中的具体问题,比如如何处理不同长度的推荐列表,或者如何选择K值。可能需要给出代码示例,但根据用户的问题,是否提供代码要看是否需要。用户的问题是关于“implementation or explanation”,所以可能需要简要的伪代码或Python实现示例。根据示例中的快速排序代码,用户允许使用代码块,所以可以考虑提供一个简单的Python函数来计算NDCG。 在实现时需要注意,首先计算DCG,然后计算IDCG,再归一化。例如,假设有一个相关性得分的列表,按照预测的排序排列,然后计算每个位置的增益,应用折扣因子,求得到DCG。IDCG是将原始列表按相关性降序排列后计算DCG,然后用DCG/IDCG得到NDCG。 还需要考虑特殊情况,比如所有相关性都为0时,IDCG可能为0,这时候NDCG可以定义为0或者忽略。另外,相关性得分通常是二进制的(相关/不相关)或多级(如0到5),需要根据具体情况处理。 可能的问题点:用户是否了解DCGIDCG的关系,是否需要更详细的例子说明。例如,给出一个具体的例子,假设推荐结果的相关性得分为[3, 2, 3, 0, 1],排序后的理想情况是[3,3,2,1,0],计算两者的DCG并相除得到NDCG。 最后,生成相关问题需要考虑用户可能进一步的问题,比如NDCG的优缺点,如何优化NDCG,或者其他指标的比较。例如,NDCGMRR的区别,或者在推荐系统中如何结合NDCG进行模型优化。</think>### 归一化折扣累积增益(NDCG)解释实现 #### 1. 核心概念 **NDCG**(Normalized Discounted Cumulative Gain)是衡量排序质量的指标,广泛用于推荐系统信息检索[^1]。其核心思想是: - **增益(Gain)**:高相关性的结果应赋予更高权重(如相关性评分$rel_i$)。 - **折扣(Discount)**:越靠后的结果对用户价值越低,需按位置进行折扣(如$\frac{1}{\log_2(i+1)}$)。 - **归一化(Normalization)**:通过理想排序的增益(IDCG)将结果映射到$[0,1]$。 数学定义如下: $$DCG@K = \sum_{i=1}^K \frac{rel_i}{\log_2(i+1)}$$ $$NDCG@K = \frac{DCG@K}{IDCG@K}$$ 其中,$IDCG@K$是前$K$个结果按真实相关性降序排列时的最大$DCG$。 #### 2. 实现步骤(Python示例) ```python import numpy as np def ndcg_at_k(relevance_scores, predicted_ranking, k): # 截断前k个预测结果 pred = predicted_ranking[:k] # 计算DCG dcg = sum( (rel / np.log2(i + 2)) for i, rel in enumerate(pred) ) # 计算IDCG(理想排序) ideal_ranking = sorted(relevance_scores, reverse=True)[:k] idcg = sum( (rel / np.log2(i + 2)) for i, rel in enumerate(ideal_ranking) ) # 归一化 return dcg / idcg if idcg > 0 else 0.0 ``` #### 3. 关键特性 - **多级相关性支持**:支持$rel_i \in \{0,1,2,...\}$,如评分或点击率。 - **位置敏感性**:通过$\log$折扣强调前排结果的重要性。 - **鲁棒性**:对长尾分布稀疏数据友好[^5]。 #### 4. 典型应用场景 - 推荐系统排序质量评估(如MovieLens数据集) - 搜索引擎结果优化 - 广告排序效果验证
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值