package com.skp.experiment.cf.evaluate.hadoop; import java.util.ArrayList; import java.util.List; import org.apache.mahout.common.Pair; public class RecallEvaluator implements Evaluator { public RecallEvaluator() {}; public List<Pair<Integer, Double>> evaluate(List<Pair<String, Double>> items, int topK, int itemCount, double negativePref) { List<Pair<Integer, Double>> result = new ArrayList<Pair<Integer, Double>>(); int prefCount = 0; int sz = Math.min(items.size(), topK); int step = topK / 10; for (int i = 0; i < sz; i += step) { // get hit count from prev ~ next for (int j = i; j < sz && j < i + step; j++) { Pair<String, Double> item = items.get(j); double realRate = item.getSecond(); if (realRate > negativePref) { prefCount++; } } // check truncated recall at this position result.add(new Pair<Integer, Double>(prefCount, prefCount / (double)itemCount)); } return result; } }