gpt4 book ai didi

java - 通过一个简单的 NDCG Java 示例获得 Always 1.0

转载 作者:行者123 更新时间:2023-11-30 08:26:16 25 4
gpt4 key购买 nike

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

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

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

假设数字作为元素的id

Java代码如下:

//{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

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 的值

你能帮我吗?

最佳答案

由于相关性似乎是二元的,并且还检索了所有相关文档,因此 1.0 是正确的值:文档 5 在文档 6 之前/之后的排名没有增益(或损失)。

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

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

关于java - 通过一个简单的 NDCG Java 示例获得 Always 1.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21651046/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com