private double GetRating(UserArticleRatings user, List <UserArticleRatings> neighbors, int articleId)
        {
            int articleIndex = ratings.ArticleIndexToID.IndexOf(articleId);

            var    nonZero       = user.ArticleRatings.Where(x => x != 0);
            double avgUserRating = nonZero.Count() > 0 ? nonZero.Average() : 0.0;

            double score = 0.0;
            int    count = 0;

            for (int u = 0; u < neighbors.Count; u++)
            {
                var    nonZeroRatings = neighbors[u].ArticleRatings.Where(x => x != 0);
                double avgRating      = nonZeroRatings.Count() > 0 ? nonZeroRatings.Average() : 0.0;

                if (neighbors[u].ArticleRatings[articleIndex] != 0)
                {
                    score += neighbors[u].ArticleRatings[articleIndex] - avgRating;
                    count++;
                }
            }
            if (count > 0)
            {
                score /= count;
                score += avgUserRating;
            }

            return(score);
        }
        public double GetRating(int userId, int articleId)
        {
            UserArticleRatings        user      = ratings.Users.FirstOrDefault(x => x.UserID == userId);
            List <UserArticleRatings> neighbors = GetNearestNeighbors(user, neighborCount);

            return(GetRating(user, neighbors, articleId));
        }
        public List <Suggestion> GetSuggestions(int userId, int numSuggestions)
        {
            int userIndex = ratings.UserIndexToID.IndexOf(userId);

            UserArticleRatings user = ratings.Users[userIndex];
            var art1  = ratings.art.OrderBy(m => m.ArticleID).ToList();
            var user1 = ratings.Users.OrderBy(m => m.UserID).ToList();
            List <Suggestion> suggestions = new List <Suggestion>();

            var neighbors = GetNearestNeighbors(user, neighborCount);

            for (int articleIndex = 0; articleIndex < ratings.ArticleIndexToID.Count; articleIndex++)
            {
                // If the user in question hasn't rated the given article yet

                if (user.ArticleRatings[articleIndex] == 0)
                {
                    double score = 0.0;
                    int    count = 0;
                    for (int u = 0; u < neighbors.Count; u++)
                    {
                        if (neighbors[u].ArticleRatings[articleIndex] != 0)
                        {
                            // Calculate the weighted score for this article
                            score += neighbors[u].ArticleRatings[articleIndex] - ((u + 1.0) / 100.0);
                            count++;
                        }
                    }
                    if (count > 0)
                    {
                        score /= count;
                    }
                    suggestions.Add(new Suggestion(userId, art1[articleIndex].ArticleID, art1[articleIndex].ArticleName, score));

                    // suggestions.Add(new Suggestion(userId, ratings.ArticleIndexToID[articleIndex],ratings.Ang1[articleIndex], score));
                }
            }

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

            return(suggestions.Take(numSuggestions).ToList());
        }
        private List <UserArticleRatings> GetNearestNeighbors(UserArticleRatings user, int numUsers)
        {
            List <UserArticleRatings> neighbors = new List <UserArticleRatings>();

            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].ArticleRatings, user.ArticleRatings);
                }
            }

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

            return(similarUsers.Take(numUsers).ToList());
        }
        public void Load(string file)
        {
            ratings = new UserArticleRatingsTable();

            using (FileStream fs = new FileStream(file, FileMode.Open))
                using (GZipStream zip = new GZipStream(fs, CompressionMode.Decompress))
                    using (StreamReader r = new StreamReader(zip))
                    {
                        long total    = long.Parse(r.ReadLine());
                        int  features = int.Parse(r.ReadLine());

                        for (long i = 0; i < total; i++)
                        {
                            int userId             = int.Parse(r.ReadLine());
                            UserArticleRatings uat = new UserArticleRatings(userId, features);

                            for (int x = 0; x < features; x++)
                            {
                                uat.ArticleRatings[x] = double.Parse(r.ReadLine());
                            }

                            ratings.Users.Add(uat);
                        }

                        total = int.Parse(r.ReadLine());

                        for (int i = 0; i < total; i++)
                        {
                            ratings.UserIndexToID.Add(int.Parse(r.ReadLine()));
                        }

                        total = int.Parse(r.ReadLine());

                        for (int i = 0; i < total; i++)
                        {
                            ratings.ArticleIndexToID.Add(int.Parse(r.ReadLine()));
                        }
                    }

            FillTransposedRatings();
        }
Exemple #6
0
        public List <Suggestion> GetSuggestions(int userId, int numSuggestions)
        {
            int userIndex                  = ratings.UserIndexToID.IndexOf(userId);
            UserArticleRatings user        = ratings.Users[userIndex];
            List <Suggestion>  suggestions = new List <Suggestion>();

            for (int articleIndex = 0; articleIndex < ratings.ArticleIndexToID.Count; articleIndex++)
            {
                // If the user in question hasn't rated the given article yet
                if (user.ArticleRatings[articleIndex] == 0)
                {
                    double rating = GetRatingForIndex(userIndex, articleIndex);

                    suggestions.Add(new Suggestion(userId, ratings.ArticleIndexToID[articleIndex], rating));
                }
            }

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

            return(suggestions.Take(numSuggestions).ToList());
        }
Exemple #7
0
        public void Load(string file)
        {
            ratings = new UserArticleRatingsTable();

            using (FileStream fs = new FileStream(file, FileMode.Open))
                using (GZipStream zip = new GZipStream(fs, CompressionMode.Decompress))
                    using (StreamReader r = new StreamReader(zip))
                    {
                        numUsers    = int.Parse(r.ReadLine());
                        numArticles = int.Parse(r.ReadLine());
                        numFeatures = int.Parse(r.ReadLine());

                        double averageGlobalRating = double.Parse(r.ReadLine());

                        double[] userBiases = new double[numUsers];
                        for (int userIndex = 0; userIndex < numUsers; userIndex++)
                        {
                            userBiases[userIndex] = double.Parse(r.ReadLine());
                        }

                        double[] articleBiases = new double[numArticles];
                        for (int articleIndex = 0; articleIndex < numArticles; articleIndex++)
                        {
                            articleBiases[articleIndex] = double.Parse(r.ReadLine());
                        }

                        double[][] userFeatures = new double[numUsers][];
                        for (int userIndex = 0; userIndex < numUsers; userIndex++)
                        {
                            userFeatures[userIndex] = new double[numFeatures];

                            for (int featureIndex = 0; featureIndex < numFeatures; featureIndex++)
                            {
                                userFeatures[userIndex][featureIndex] = double.Parse(r.ReadLine());
                            }
                        }

                        double[][] articleFeatures = new double[numArticles][];
                        for (int articleIndex = 0; articleIndex < numUsers; articleIndex++)
                        {
                            articleFeatures[articleIndex] = new double[numFeatures];

                            for (int featureIndex = 0; featureIndex < numFeatures; featureIndex++)
                            {
                                articleFeatures[articleIndex][featureIndex] = double.Parse(r.ReadLine());
                            }
                        }

                        svd = new SvdResult(averageGlobalRating, userBiases, articleBiases, userFeatures, articleFeatures);

                        for (int i = 0; i < numUsers; i++)
                        {
                            int userId             = int.Parse(r.ReadLine());
                            UserArticleRatings uat = new UserArticleRatings(userId, numArticles);

                            for (int x = 0; x < numArticles; x++)
                            {
                                uat.ArticleRatings[x] = double.Parse(r.ReadLine());
                            }

                            ratings.Users.Add(uat);
                        }

                        for (int i = 0; i < numUsers; i++)
                        {
                            ratings.UserIndexToID.Add(int.Parse(r.ReadLine()));
                        }

                        for (int i = 0; i < numArticles; i++)
                        {
                            ratings.ArticleIndexToID.Add(int.Parse(r.ReadLine()));
                        }
                    }
        }