예제 #1
0
        private List <UserProductRatings> GetNearestNeighbors(UserProductRatings user, int numUsers)
        {
            List <UserProductRatings> neighbors = new List <UserProductRatings>();

            for (int i = 0; i < ratings.Users.Count; i++)
            {
                if (ratings.Users[i].UserID == user.UserID)
                {
                    ratings.Users[i].Score = double.NegativeInfinity;
                }
                else
                {
                    ratings.Users[i].Score = comparer.CompareVectors(ratings.Users[i].ProductRatings, user.ProductRatings);
                }
            }

            var similarUsers = ratings.Users.OrderByDescending(x => x.Score);

            return(similarUsers.Take(numUsers).ToList());
        }
예제 #2
0
        public List <Suggestion> GetSuggestions(ObjectId userId, int numSuggestions)
        {
            int userIndex                  = ratings.UserIndexToID.IndexOf(userId);
            UserProductRatings user        = ratings.Users[userIndex];
            List <Suggestion>  suggestions = new List <Suggestion>();

            var neighbors = GetNearestNeighbors(user, neighborCount);

            for (int productIndex = 0; productIndex < ratings.ProductIndexToID.Count; productIndex++)
            {
                // If the user in question hasn't rated the given product yet
                if (user.ProductRatings[productIndex] == 0)
                {
                    double score = 0.0;
                    int    count = 0;
                    for (int u = 0; u < neighbors.Count; u++)
                    {
                        if (neighbors[u].ProductRatings[productIndex] != 0)
                        {
                            // Calculate the weighted score for this product
                            score += neighbors[u].ProductRatings[productIndex];
                            count++;
                        }
                    }
                    if (count > 0)
                    {
                        score /= count;
                    }

                    suggestions.Add(new Suggestion(userId, ratings.ProductIndexToID[productIndex], score));
                }
            }

            suggestions.Sort((c, n) => n.Rating.CompareTo(c.Rating));

            return(suggestions.Take(numSuggestions).ToList());
        }