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); }
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()); }