public static ScoreResults Score(this IRecommender classifier, UserBehaviorDatabase db, IRater rater) { UserBehaviorTransformer ubt = new UserBehaviorTransformer(db); UserArticleRatingsTable actualRatings = ubt.GetUserArticleRatingsTable(rater); var distinctUserArticlePairs = db.UserActions.GroupBy(x => new { x.UserID, x.ArticleID }).ToList(); double score = 0.0; int count = 0; foreach (var userArticle in distinctUserArticlePairs) { int userIndex = actualRatings.UserIndexToID.IndexOf(userArticle.Key.UserID); int articleIndex = actualRatings.ArticleIndexToID.IndexOf(userArticle.Key.ArticleID); double actualRating = actualRatings.Users[userIndex].ArticleRatings[articleIndex]; if (actualRating != 0) { double predictedRating = classifier.GetRating(userArticle.Key.UserID, userArticle.Key.ArticleID); score += Math.Pow(predictedRating - actualRating, 2); count++; } } if (count > 0) { score = Math.Sqrt(score / count); } return(new ScoreResults(score)); }
private void bgScore_DoWork(object sender, DoWorkEventArgs e) { GetRating args = e.Argument as GetRating; e.Result = recommender.GetRating(args.UserID, args.ArticleID); }