private double getIdealDCG(final int[] rel, final int topK) { final int[] idx = Sorter.sort(rel, false); double dcg = 0; for (int i = 0; i < topK; i++) { dcg += gain(rel[idx[i]]) * discount(i); } return dcg; } }
private double getIdealDCG(int[] rel, int topK) { int[] idx = Sorter.sort(rel, false); double dcg = 0; for(int i=0;i<topK;i++) dcg += gain(rel[idx[i]]) * discount(i); return dcg; } }
@Override public double[][] swapChange(final RankList rl) { final int size = (rl.size() > k) ? k : rl.size(); //compute the ideal ndcg final int[] rel = getRelevanceLabels(rl); double ideal = 0; final Double d = idealGains.get(rl.getID()); if (d != null) { ideal = d; } else { ideal = getIdealDCG(rel, size); //idealGains.put(rl.getID(), ideal);//DO *NOT* do caching here. It's not thread-safe. } final double[][] changes = new double[rl.size()][]; for (int i = 0; i < rl.size(); i++) { changes[i] = new double[rl.size()]; Arrays.fill(changes[i], 0); } for (int i = 0; i < size; i++) { for (int j = i + 1; j < rl.size(); j++) { if (ideal > 0) { changes[j][i] = changes[i][j] = (discount(i) - discount(j)) * (gain(rel[i]) - gain(rel[j])) / ideal; } } } return changes; }
public double[][] swapChange(RankList rl) { int size = (rl.size() > k) ? k : rl.size(); //compute the ideal ndcg int[] rel = getRelevanceLabels(rl); double ideal = 0; Double d = idealGains.get(rl.getID()); if(d != null) ideal = d; else { ideal = getIdealDCG(rel, size); //idealGains.put(rl.getID(), ideal);//DO *NOT* do caching here. It's not thread-safe. } double[][] changes = new double[rl.size()][]; for(int i=0;i<rl.size();i++) { changes[i] = new double[rl.size()]; Arrays.fill(changes[i], 0); } for(int i=0;i<size;i++) for(int j=i+1;j<rl.size();j++) if(ideal > 0) changes[j][i] = changes[i][j] = (discount(i) - discount(j)) * (gain(rel[i]) - gain(rel[j])) / ideal; return changes; } public String name()