package com.skp.experiment.cf.evaluate.hadoop;
import java.util.Arrays;
import java.util.List;
import org.apache.mahout.common.Pair;
public class ExpectedPercentileRankEvaluator implements Evaluator {
private static final double EPS = 10e-6;
public ExpectedPercentileRankEvaluator() {};
@Override
public List<Pair<Integer, Double>> evaluate(List<Pair<String, Double>> items,
int topK, int itemCount, double negativePref) {
double expectedSum = 0.0;
double realSum = 0.0;
int prefCount = 0;
int sz = Math.min(items.size(), topK);
for (int i = 0; i < sz; i++) {
Pair<String, Double> item = items.get(i);
double realRate = item.getSecond();
if (realRate > negativePref) {
prefCount++;
}
double percentile = 0.0;
if (i == sz-1) {
percentile = 100.0;
} else {
percentile = 100.0 * i / items.size();
}
realSum += percentile * realRate;
expectedSum += realRate;
}
if (expectedSum < EPS) {
return Arrays.asList(new Pair<Integer, Double>(prefCount, 0.0));
}
return Arrays.asList(new Pair<Integer, Double>(prefCount, realSum / expectedSum));
}
}