예제 #1
0
        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);
        }
예제 #2
0
        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());
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
        }