@Override
double getEvaluation(Map<User, Collection<Preference>> testUserPrefs,
Recommender recommender)
throws TasteException {
RunningAverage average = new FullRunningAverage();
for (Map.Entry<User, Collection<Preference>> entry : testUserPrefs.entrySet()) {
for (Preference realPref : entry.getValue()) {
User testUser = entry.getKey();
try {
double estimatedPreference =
recommender.estimatePreference(testUser.getID(), realPref.getItem().getID());
if (!Double.isNaN(estimatedPreference)) {
double diff = realPref.getValue() - estimatedPreference;
average.addDatum(diff * diff);
}
} catch (NoSuchUserException nsee) {
// It's possible that an item exists in the test data but not training data in which case
// NSEE will be thrown. Just ignore it and move on.
log.info("Element exists in test data but not training data: {}", testUser.getID(), nsee);
}
}
}
return Math.sqrt(average.getAverage());
}