private BookScore EvaluateScore(IEnumerable <UsersSimilarity> similarUsers, BookScore bookScore, double meanRateForUser) { var scoreNumerator = 0.0; var scoreDenominator = 0.0; var rate = 0.0; foreach (var u in similarUsers) { var book = u.BooksUniqueForComparedUser.FirstOrDefault(x => x.BookId == bookScore.BookId); if (book == null || u.AverageScoreForComparedUser == null || u.Similarity == null) { continue; } scoreNumerator += (book.Rate - u.AverageScoreForComparedUser.Value) * u.Similarity.Value; scoreDenominator += Math.Abs(u.Similarity.Value); } if (scoreDenominator != 0) { rate = scoreNumerator / scoreDenominator + meanRateForUser; } bookScore.PredictedRate = Math.Round(rate, 2); return(bookScore); }
private List <BookScore> GetAllRecommendedBooksForUser(List <UsersSimilarity> similarUsers, int userId, string[] booksIds) { if (similarUsers == null || similarUsers?.Count == 0) { return(null); } var recommendedBooks = new List <BookScore>(); if (booksIds.Length == 0) { PersistRecommendedBooksInDb(null, userId); return(null); } var meanRateForUser = _context.GetAverageRateForUser(userId) ?? 0; foreach (var id in booksIds) { var temp = new BookScore { UserId = userId, BookId = id }; var bookScore = EvaluateScore(similarUsers, temp, meanRateForUser); if (bookScore != null) { recommendedBooks.Add(bookScore); } } return(recommendedBooks.OrderByDescending(x => x.PredictedRate).ToList()); }
public BookScore[] CreateBookScores(int userId, string[] isbn, short[] rates, double[] predictedRates = null) { var results = new BookScore[isbn.Length]; for (int i = 0; i < isbn.Length; i++) { var predictedRate = predictedRates == null?RandomNumber(1) : predictedRates[i]; results[i] = new BookScore { UserId = userId, BookId = isbn[i], Rate = rates[i], PredictedRate = predictedRate }; } return(results); }
public void BookScoreComparer_ShouldReturnLower(int userId, string bookId, double predictedRate) { var x = new BookScore { UserId = 1, BookId = "1", PredictedRate = 5, Rate = 23 }; var y = new BookScore { UserId = userId, BookId = bookId, PredictedRate = predictedRate, Rate = 23 }; _sut.Compare(x, y).ShouldBe(-1); }