private double idcg(UserIdealRelevanceModel<U, I> urm) { double ideal = 0; Object2IntOpenHashMap<F> redundancy = new Object2IntOpenHashMap<>(); redundancy.defaultReturnValue(0); Set<I> candidates = new HashSet<>(urm.getRelevantItems()); int rank = 0; while (rank <= cutoff && !candidates.isEmpty()) { I bi = null; double bg = Double.NEGATIVE_INFINITY; for (I i : candidates) { double gain = featureData.getItemFeatures(i) .map(Tuple2::v1) .mapToDouble(f -> Math.pow(1 - alpha, redundancy.getInt(f))) .sum(); if (gain > bg) { bg = gain; bi = i; } } candidates.remove(bi); featureData.getItemFeatures(bi).sequential() .map(Tuple2::v1) .forEach(f -> redundancy.addTo(f, 1)); ideal += bg * disc.disc(rank); rank++; } return ideal; }
UserIdealRelevanceModel<U, I> userRelModel = relModel.getModel(recommendation.getUser()); int nRelItems = min(cutoff, userRelModel.getRelevantItems().size()); if (nRelItems == 0) { return 0.0; if (userRelModel.isRelevant(pair.v1)) { relCount++; ap += relCount / (double) rank;
/** * Returns a score for the recommendation list. * * @param recommendation recommendation list * @return score of the metric to the recommendation */ @Override public double evaluate(Recommendation<U, I> recommendation) { U user = recommendation.getUser(); IdealRelevanceModel.UserIdealRelevanceModel<U, I> userRelModel = relModel.getModel(user); int numberOfAllRelevant = relModel.getModel(user).getRelevantItems().size(); if (numberOfAllRelevant == 0) { return 0.0; } return recommendation.getItems().stream() .limit(cutoff) .map(Tuple2od::v1) .filter(userRelModel::isRelevant) .count() / (double) numberOfAllRelevant; } }