package com.skp.experiment.cf.evaluate.hadoop;
import java.util.Arrays;
import java.util.List;
import org.apache.hadoop.util.ToolRunner;
import org.apache.mahout.common.Pair;
public class MeanAveragePrecisionEvaluator implements Evaluator {
/*
* assumes sorted list of <estimated rate, boolean real rate(0/1)>
* implement Mean Average precision
*/
private static final double EPS = 10e-6;
@Override
public List<Pair<Integer, Double>> evaluate(List<Pair<String, Double>> items,
int topK, int itemCount, double negativePref) {
int prefCnt = 0;
double averagePrecisionSum = 0.0;
int sz = Math.min(topK, items.size());
for (int i = 0; i < sz; i++) {
Pair<String, Double> item = items.get(i);
double realRate = item.getSecond();
boolean isThisPositivePref = false;
if (realRate > negativePref) {
prefCnt++;
isThisPositivePref = true;
}
if (isThisPositivePref) {
Double precAtI = prefCnt / (double)(i+1);
averagePrecisionSum += precAtI;
}
}
averagePrecisionSum /= (double) Math.min(itemCount, topK);
return Arrays.asList(new Pair<Integer, Double>(prefCnt, averagePrecisionSum));
}
}