@Override public void add(Recommendation<U, I> recommendation) { RelevanceModel.UserRelevanceModel<U, I> urm = rel.getModel(recommendation.getUser()); List<Tuple2od<I>> list = recommendation.getItems(); int rank = Math.min(cutoff, list.size()); double userNorm = IntStream.range(0, rank).mapToDouble(disc::disc).sum(); IntStream.range(0, rank).forEach(k -> { I i = list.get(k).v1; double d = disc.disc(k); double w = d * urm.gain(i) / userNorm; itemCount.addTo(i, d); itemWeight.addTo(i, w); }); freeNorm += userNorm; numUsers++; }
/** * 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(); }
nov += disc.disc(rank) * userRelModel.gain(iv.v1) * uinm.novelty(iv.v1); norm += disc.disc(rank); rank++;