/** * 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) { RelevanceModel.UserRelevanceModel<U, I> userRelModel = relModel.getModel(recommendation.getUser()); Set<F> subtopics = new HashSet<>(); int rank = 0; for (Tuple2od<I> iv : recommendation.getItems()) { if (userRelModel.isRelevant(iv.v1)) { subtopics.addAll(featureData.getItemFeatures(iv.v1) .map(Tuple2::v1) .collect(toList())); } rank++; if (rank >= cutoff) { break; } } return subtopics.size() / (double) featureData.numFeatures(); }
/** * 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) { RelevanceModel.UserRelevanceModel<U, I> urm = relModel.getModel(recommendation.getUser()); List<Tuple2od<I>> items = recommendation.getItems(); int r = range(0, items.size()) .limit(cutoff) .filter(k -> urm.isRelevant(items.get(k).v1)) .findFirst().orElse(-1); if (r == -1) { return 0; } else { return 1 / (1.0 + r); } } }
/** * 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) { RelevanceModel.UserRelevanceModel<U, I> userRelModel = relModel.getModel(recommendation.getUser()); UserIntentModel<U, I, F> uim = intentModel.getModel(recommendation.getUser()); DoubleAdder erria = new DoubleAdder(); Object2DoubleMap<F> pNoPrevRel = new Object2DoubleOpenHashMap<>(); pNoPrevRel.defaultReturnValue(0.0); uim.getIntents().forEach(f -> pNoPrevRel.put(f, 1.0)); AtomicInteger rank = new AtomicInteger(); recommendation.getItems().stream().limit(cutoff).forEach(iv -> { if (userRelModel.isRelevant(iv.v1)) { double gain = userRelModel.gain(iv.v1); uim.getItemIntents(iv.v1).forEach(f -> { double red = pNoPrevRel.getDouble(f); erria.add(uim.pf_u(f) * gain * red / (1.0 + rank.intValue())); pNoPrevRel.put(f, red * (1 - gain)); }); } rank.incrementAndGet(); }); return erria.doubleValue(); }
double cpr = 0.0; for (Tuple2od<I> iv : recommendation.getItems()) { if (userRelModel.isRelevant(iv.v1)) { featureData.getItemFeatures(iv.v1) .forEach(fv -> count.addTo(fv.v1, 1));
if (urm.isRelevant(pair.v1)) { double gain = featureData.getItemFeatures(pair.v1).sequential() .map(Tuple2::v1)
/** * 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) { RelevanceModel.UserRelevanceModel<U, I> userRelModel = relModel.getModel(recommendation.getUser()); BinomialModel<U, I, F>.UserBinomialModel prob = binomialModel.getModel(recommendation.getUser()); Object2IntOpenHashMap<F> count = new Object2IntOpenHashMap<>(); count.defaultReturnValue(0); int rank = 0; int nrel = 0; for (Tuple2od<I> iv : recommendation.getItems()) { if (userRelModel.isRelevant(iv.v1)) { featureData.getItemFeatures(iv.v1) .forEach(fv -> count.addTo(fv.v1, 1)); nrel++; } rank++; if (rank >= cutoff) { break; } } return getResultFromCount(prob, count, nrel, rank); }