public override double CalculateError(IRecommendation recommendation, IEnumerable <IRating> ratings, IEnumerable <IRater> raters, IEnumerable <ISubject> subjects) { var sum = 0D; var count = 0; foreach (var rating in ratings) { var value = recommendation.RecommendSubject(rating.Rater, rating.Subject); if (value == null) { continue; } var diff = value.Value - rating.Value; sum += Math.Abs(diff); ++count; } ; if (count == 0) { return(-1); } var error = sum / count; return(error); }
public IRating RecommendSubject(IRater rater, ISubject subject) { var key = CreateCacheKey(rater, subject); var cachedValue = 0D; if (_cache.TryGetValue(key, out cachedValue)) { return(new SimpleRating(rater, subject, cachedValue)); } var rating = _algorithm.RecommendSubject(rater, subject); if (rating != null) { _cache[key] = rating.Value; } return(rating); }