首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过一个简单的NDCG Java示例获得始终1.0

通过一个简单的NDCG Java示例获得始终1.0
EN

Stack Overflow用户
提问于 2014-02-09 03:54:25
回答 1查看 1K关注 0票数 3

正如您可能知道的,NDCG是一个很好的排名指标。我正在尝试使用它来获得下面两个列表的性能值:

list1-->{2,5,6,8,3}-->这是排名列表

list2--> {2,6,5,8,3}-->这是正确的列表

假设这些数字是元素的ids

以下是Java代码:

代码语言:javascript
复制
//{2, 5, 6, 8, 3};
    List<Integer> rankedList = new ArrayList<Integer>();
    rankedList.add(2);
    rankedList.add(5);
    rankedList.add(6);
    rankedList.add(8);
    rankedList.add(3);

    //{2, 6, 5, 8, 3}
    List<Integer> correctList = new ArrayList<Integer>();
    correctList.add(2);
    correctList.add(6);
    correctList.add(5);
    correctList.add(8);
    correctList.add(3);
    double ndcgVal = NDCG.compute(rankedList, correctList, null);
    System.out.println("NDCG Value: " + ndcgVal);

来源:https://github.com/jcnewell/MyMediaLiteJava/blob/master/src/org/mymedialite/eval/measures/NDCG.java

代码语言:javascript
复制
package org.fatih.networkpatternsui;

import java.util.Collection;

import java.util.HashSet;

import java.util.List;

public class NDCG {

// Prevent instantiation.
private NDCG() {}
public static double compute(
  List<Integer> ranked_items,
  Collection<Integer> correct_items,
  Collection<Integer> ignore_items) {

if (ignore_items == null)
  ignore_items = new HashSet<Integer>();

double dcg = 0;
double idcg = computeIDCG(correct_items.size());
int left_out = 0;

for (int i = 0; i < ranked_items.size(); i++) {
  int item_id = ranked_items.get(i);
  if (ignore_items.contains(item_id)) {
    left_out++;
    continue;
  }

  if (!correct_items.contains(item_id))
    continue;

  // compute NDCG part
  int rank = i + 1 - left_out;
  dcg += Math.log(2) / Math.log(rank + 1);

}

return dcg / idcg;
static double computeIDCG(int n)
{
double idcg = 0;
for (int i = 0; i < n; i++)
  idcg += Math.log(2) / Math.log(i + 2);
return idcg;
}
}

这里的问题是我总是得到1.0的值

你能帮我拿一下吗?

EN

回答 1

Stack Overflow用户

发布于 2014-02-12 02:58:28

由于相关性似乎是二进制的,而且还检索了所有相关文档,因此1.0是正确的值:在文档6之前/之后对文档5进行排序没有任何收益(或损失)。

尝试在您的排名列表中包括不相关的文档(即不正确的文档in ),您应该会看到差异。特别是,对于不相关的文档尝试不同的位置,以观察日志(排名)的作用。

如果您考虑分级相关性并在代码中包含相关性分数,假设文档6的相关性高于文档5(即,较高的相关性分数),则rankedList将是次优的,因此将具有ndcg<1.0

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21651046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档