Beispiel #1
0
        public List <MovieViewModel> GetSuggestions(string userId, int numSuggestions, UserMovieRatingsTable table)
        {
            int userIndex = table.UserIndexToId.IndexOf(userId);
            UserMoviesRatings        user        = table.Users[userIndex];
            List <Suggestion>        suggestions = new List <Suggestion>();
            List <UserMoviesRatings> neighbors   = GetNearestNeighbors(userId, user, 5, table);

            if (neighbors.ToList()[0].Score <= 0.5)
            {
                ItemBasedRecommender itemBasedRecommender = new ItemBasedRecommender(_mapper, _movieRepository);
                return(itemBasedRecommender.GetSuggestions(userId, 10, table));
            }
            for (int movieIndex = 0; movieIndex < table.MovieIndexToId.Count; movieIndex++)
            {
                if (user.MovieRatings[movieIndex] != 0)
                {
                    double score = 0.0;
                    int    count = 0;
                    for (var u = 0; u < neighbors.Count; u++)
                    {
                        if (neighbors[u].MovieRatings[movieIndex] != 0)
                        {
                            score += neighbors[u].MovieRatings[movieIndex] - ((u + 1.0) / 100.0);
                            count++;
                        }
                    }
                    if (count > 0)
                    {
                        score /= count;
                    }
                    suggestions.Add(new Suggestion(userId, table.MovieIndexToId[movieIndex], score));
                }
            }
            suggestions.Sort((c, n) => n.Rating.CompareTo(c.Rating));
            List <Suggestion>     suggestionsList = suggestions.Take(numSuggestions).ToList();
            List <MovieViewModel> movieViewModels = new List <MovieViewModel>();

            foreach (var suggestion in suggestionsList)
            {
                Movie movie = _movieRepository.GetById(suggestion.MovieId);
                movieViewModels.Add(_mapper.Map <MovieViewModel>(movie));
            }
            return(movieViewModels);
        }
Beispiel #2
0
        private List <UserMoviesRatings> GetNearestNeighbors(string userId, UserMoviesRatings user, int numUsers, UserMovieRatingsTable table)
        {
            List <UserMoviesRatings> neighbors = new List <UserMoviesRatings>();
            Methods pearsoneCorrelation        = new Methods {
            };

            for (var i = 0; i < table.Users.Count(); i++)
            {
                if (table.Users[i].UserId == user.UserId)
                {
                    table.Users[i].Score = double.NegativeInfinity;
                }
                else
                {
                    table.Users[i].Score = pearsoneCorrelation.PearsoneCorrelation(table.Users[i].MovieRatings, user.MovieRatings);
                }
            }
            var similarUsers = table.Users.OrderByDescending(x => x.Score);

            return(similarUsers.Take(numUsers).ToList());
        }