예제 #1
0
        public static ScoreResults Score(this IRecommender classifier, UserBehaviorDatabase db, IRater rater)
        {
            UserBehaviorTransformer ubt           = new UserBehaviorTransformer(db);
            UserArticleRatingsTable actualRatings = ubt.GetUserArticleRatingsTable(rater);

            var distinctUserArticlePairs = db.UserActions.GroupBy(x => new { x.UserID, x.ArticleID }).ToList();

            double score = 0.0;
            int    count = 0;

            foreach (var userArticle in distinctUserArticlePairs)
            {
                int userIndex    = actualRatings.UserIndexToID.IndexOf(userArticle.Key.UserID);
                int articleIndex = actualRatings.ArticleIndexToID.IndexOf(userArticle.Key.ArticleID);

                double actualRating = actualRatings.Users[userIndex].ArticleRatings[articleIndex];

                if (actualRating != 0)
                {
                    double predictedRating = classifier.GetRating(userArticle.Key.UserID, userArticle.Key.ArticleID);

                    score += Math.Pow(predictedRating - actualRating, 2);
                    count++;
                }
            }

            if (count > 0)
            {
                score = Math.Sqrt(score / count);
            }

            return(new ScoreResults(score));
        }
 public void Train(UserBehaviorDatabase db)
 {
     foreach (IRecommender classifier in classifiers)
     {
         classifier.Train(db);
     }
 }
예제 #3
0
        public List <Suggestion> GetFirstSuggestions(UserBehaviorDatabase db, Databases.DomainModel.User user, int numSuggestions)
        {
            var userActionGroup = db.UserActions
                                  .GroupBy(x => new { x.UserID })
                                  .Select(g => new { g.Key.UserID })
                                  .ToList();

            List <Suggestion> suggestions = new List <Suggestion>();
            MongodbFunctions  mongo       = new MongodbFunctions();

            foreach (var a in userActionGroup)
            {
                Databases.DomainModel.User u = mongo.GetUser(a.UserID);

                if (u.Gender.Equals(user.Gender) || u.BirthDate.Year == user.BirthDate.Year)
                {
                    int        userIndex = ratings.UserIndexToID.IndexOf(u.Id);
                    List <int> products  = GetHighestRatedProductsForUser(userIndex).Take(3).ToList();

                    foreach (int productIndex in products)
                    {
                        ObjectId productId = ratings.ProductIndexToID[productIndex];
                        suggestions.Add(new Suggestion(u.Id, productId, ratings.Users[userIndex].ProductRatings[productIndex]));
                    }
                }
            }

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

            return(suggestions.Take(numSuggestions).ToList());
        }
예제 #4
0
        private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            UserBehaviorDatabaseParser parser = new UserBehaviorDatabaseParser();
            UserBehaviorDatabase       db     = parser.LoadUserBehaviorDatabase(e.Argument as string);

            recommender.Train(db);
            recommender.Save(savedModel);
        }
예제 #5
0
        public ActionResult Details(int id)
        {
            UserBehaviorDatabaseParser parser = new UserBehaviorDatabaseParser();

            UserBehaviorDatabase db1 = parser.LoadUserBehaviorDatabase("/Data/NewBehavior.txt");

            UserBehaviorTransformer ubt = new UserBehaviorTransformer(db1);
            int    userid = Convert.ToInt32(Session["id"].ToString());
            string email  = context.login.Where(m => m.Id == userid).FirstOrDefault().Email;
            int    realid = context.students.Where(m => m.Email == email).FirstOrDefault().Id;

            string           name  = context.students.Where(m => m.Id == realid).FirstOrDefault().FirstName;
            UplodedFile      admin = context.ufiles.Find(id);
            SimilarViewModel sam   = new SimilarViewModel();

            sam.Description     = admin.Description;
            sam.Id              = admin.Id;
            sam.Name            = admin.Name;
            sam.UpdatedFileName = admin.UpdatedFileName;
            sam.UplodedBy       = admin.UplodedBy;
            sam.UplodedDate     = admin.UplodedDate;
            sam.path            = context.ufiles.Where(m => m.Id == id).FirstOrDefault().Filename;
            UserArticleRatingsTable ratings1;
            IRater rate = new LinearRater(-4, 2, 0.5, 1);

            ratings1 = ubt.GetUserArticleRatingsTable(rate);
            List <SuggestedArticlePoints> SAT = ratings1.suggestArticle(ratings1.art, id);

            List <UplodedFile> up  = new List <UplodedFile>();
            UplodedFile        upa = new UplodedFile();
            int           i        = 0;
            List <double> p        = new List <double>();

            foreach (var item in SAT)
            {
                p.Add(item.Points);



                upa = context.ufiles.Where(m => m.Id == item.ArticleId).FirstOrDefault();
                up.Add(upa);
            }
            sam.point        = p;
            sam.uplodedFiles = up;
            double        a     = sam.point[0];
            var           text  = System.IO.File.ReadAllText("/Data/NewBehavior.txt");
            List <string> lines = System.IO.File.ReadAllLines("/Data/NewBehavior.txt").ToList();
            int           index = text.IndexOf("# End");

            text = text.Insert(index, "1,View," + realid + "," + name + "," + admin.Id + "," + admin.Name + Environment.NewLine);
            System.IO.File.WriteAllText("/Data/NewBehavior.txt", text);



            return(View(sam));
        }
예제 #6
0
        public static void TestAllRecommenders()
        {
            UserBehaviorDatabaseParser dbp = new UserBehaviorDatabaseParser();
            UserBehaviorDatabase       db  = dbp.LoadUserBehaviorDatabase("UserBehaviour.txt");

            //var ubt = new UserBehaviorTransformer(db);
            //var uart = ubt.GetUserArticleRatingsTable();
            //uart.SaveSparcityVisual("sparcity.bmp");
            //uart.SaveUserRatingDistribution("distrib.csv");
            //uart.SaveArticleRatingDistribution("distriba.csv");

            var rate = new LinearRater();
            var sp   = new DaySplitter(db, 5);
            var uc   = new CorrelationUserComparer();

            //var rr = new RandomRecommender();
            //rr.Train(sp.TrainingDB);
            //ScoreResults scores5 = rr.Score(sp.TestingDB, rate);
            //TestResults results5 = rr.Test(sp.TestingDB, 30);

            var ubc = new UserCollaborativeFilterRecommender(uc, rate, 30);
            var mfr = new MatrixFactorizationRecommender(30, rate);
            var icf = new ItemCollaborativeFilterRecommender(uc, rate, 30);
            var hbr = new HybridRecommender(ubc, mfr, icf);

            hbr.Train(sp.TrainingDB);
            ScoreResults scores1  = hbr.Score(sp.TestingDB, rate);
            TestResults  results1 = hbr.Test(sp.TestingDB, 30);

            ubc = new UserCollaborativeFilterRecommender(uc, rate, 30);
            mfr = new MatrixFactorizationRecommender(30, rate);
            icf = new ItemCollaborativeFilterRecommender(uc, rate, 30);

            ubc.Train(sp.TrainingDB);
            ScoreResults scores2  = ubc.Score(sp.TestingDB, rate);
            TestResults  results2 = ubc.Test(sp.TestingDB, 30);

            mfr.Train(sp.TrainingDB);
            ScoreResults scores3  = mfr.Score(sp.TestingDB, rate);
            TestResults  results3 = mfr.Test(sp.TestingDB, 30);

            icf.Train(sp.TrainingDB);
            ScoreResults scores4  = icf.Score(sp.TestingDB, rate);
            TestResults  results4 = icf.Test(sp.TestingDB, 30);

            using (StreamWriter w = new StreamWriter("results.csv"))
            {
                w.WriteLine("model,rmse,users,user-solved,precision,recall");
                w.WriteLine("UCF," + scores2.RootMeanSquareDifference + "," + results2.TotalUsers + "," + results2.UsersSolved + "," + results2.AveragePrecision + "," + results2.AverageRecall);
                w.WriteLine("SVD," + scores3.RootMeanSquareDifference + "," + results3.TotalUsers + "," + results3.UsersSolved + "," + results3.AveragePrecision + "," + results3.AverageRecall);
                w.WriteLine("ICF," + scores4.RootMeanSquareDifference + "," + results4.TotalUsers + "," + results4.UsersSolved + "," + results4.AveragePrecision + "," + results4.AverageRecall);
                w.WriteLine("HR," + scores1.RootMeanSquareDifference + "," + results1.TotalUsers + "," + results1.UsersSolved + "," + results1.AveragePrecision + "," + results1.AverageRecall);
            }
        }
예제 #7
0
        public void Train(UserBehaviorDatabase db)
        {
            UserBehaviorTransformer ubt = new UserBehaviorTransformer(db);

            ratings = ubt.GetUserProductRatingsTable(rater);

            List <ProductCategoryCount> productCategories = ubt.GetProductCategoryCounts();

            ratings.AppendProductFeatures(productCategories);

            FillTransposedRatings();
        }
예제 #8
0
        public void Train(UserBehaviorDatabase db)
        {
            UserBehaviorTransformer ubt = new UserBehaviorTransformer(db);

            ratings = ubt.GetUserArticleRatingsTable(rater);

            List <ArticleTagCounts> articleTags = ubt.GetArticleTagCounts();

            ratings.AppendArticleFeatures(articleTags);

            FillTransposedRatings();
        }
        public static TestResults Test(this IRecommender classifier, UserBehaviorDatabase db, int numSuggestions)
        {
            // We're only using the ratings to check for existence of a rating, so we can use a simple rater for everything
            SimpleRater             rater   = new SimpleRater();
            UserBehaviorTransformer ubt     = new UserBehaviorTransformer(db);
            UserArticleRatingsTable ratings = ubt.GetUserArticleRatingsTable(rater);

            int    correctUsers     = 0;
            double averagePrecision = 0.0;
            double averageRecall    = 0.0;

            // Get a list of users in this database who interacted with an article for the first time
            List <int> distinctUsers = db.UserActions.Select(x => x.UserID).Distinct().ToList();

            var distinctUserArticles = db.UserActions.GroupBy(x => new { x.UserID, x.ArticleID });

            // Now get suggestions for each of these users
            foreach (int user in distinctUsers)
            {
                List <Suggestion> suggestions = classifier.GetSuggestions(user, numSuggestions);
                bool foundOne  = false;
                int  userIndex = ratings.UserIndexToID.IndexOf(user);

                int userCorrectArticles = 0;
                int userTotalArticles   = distinctUserArticles.Count(x => x.Key.UserID == user);

                foreach (Suggestion s in suggestions)
                {
                    int articleIndex = ratings.ArticleIndexToID.IndexOf(s.ArticleID);

                    // If one of the top N suggestions is what the user ended up reading, then we're golden
                    if (ratings.Users[userIndex].ArticleRatings[articleIndex] != 0)
                    {
                        userCorrectArticles++;

                        if (!foundOne)
                        {
                            correctUsers++;
                            foundOne = true;
                        }
                    }
                }

                averagePrecision += (double)userCorrectArticles / numSuggestions;
                averageRecall    += (double)userCorrectArticles / userTotalArticles;
            }

            averagePrecision /= distinctUsers.Count;
            averageRecall    /= distinctUsers.Count;

            return(new TestResults(distinctUsers.Count, correctUsers, averageRecall, averagePrecision));
        }
예제 #10
0
        public void Train(UserBehaviorDatabase db)
        {
            UserBehaviorTransformer ubt = new UserBehaviorTransformer(db);

            ratings = ubt.GetUserArticleRatingsTable(rater);

            SingularValueDecomposition factorizer = new SingularValueDecomposition(numFeatures, learningIterations);

            svd = factorizer.FactorizeMatrix(ratings);

            numUsers    = ratings.UserIndexToID.Count;
            numArticles = ratings.ArticleIndexToID.Count;
        }
        public void Train(UserBehaviorDatabase db)
        {
            UserBehaviorTransformer ubt = new UserBehaviorTransformer(db);

            ratings = ubt.GetUserArticleRatingsTable(rater);

            if (latentUserFeatureCount > 0)
            {
                SingularValueDecomposition svd = new SingularValueDecomposition(latentUserFeatureCount, 100);
                SvdResult results = svd.FactorizeMatrix(ratings);

                ratings.AppendUserFeatures(results.UserFeatures);
            }
        }
        public void Train(UserBehaviorDatabase db)
        {
            UserBehaviorTransformer ubt = new UserBehaviorTransformer(db);

            ratings = ubt.GetUserArticleRatingsTable(rater);

            List <ArticleTagCounts> articleTags = ubt.GetArticleTagCounts();
            //train article
            List <ArticleAndTag> articles1 = ubt.Angualr2();

            ratings.AppendArticleFeatures(articleTags);
            // ratings.suggestArticle(articles1, 3);

            FillTransposedRatings();
        }
        public void Train(UserBehaviorDatabase db)
        {
            UserBehaviorTransformer ubt = new UserBehaviorTransformer(db);

            ratings     = ubt.GetUserArticleRatingsTable(rater);
            ratings.art = ubt.Angualr2();
            List <ArticleAndTag> articles1 = ubt.Angualr2();

            //if (latentUserFeatureCount > 0)
            //{
            //    SingularValueDecomposition svd = new SingularValueDecomposition(latentUserFeatureCount, 100);
            //    SvdResult results = svd.FactorizeMatrix(ratings);

            //    ratings.AppendUserFeatures(results.UserFeatures);
            //}
        }
예제 #14
0
 public void Train(UserBehaviorDatabase db)
 {
 }
예제 #15
0
        public void Train(UserBehaviorDatabase db)
        {
            UserBehaviorTransformer ubt = new UserBehaviorTransformer(db);

            ratings = ubt.GetUserProductRatingsTable(rater);
        }
예제 #16
0
        public ActionResult Index(string search = "")
        {
            if (search == "")
            {
                int       id      = Convert.ToInt32(Session["id"].ToString());
                string    email   = context.login.Where(m => m.Id == id).FirstOrDefault().Email;
                int       realid  = context.students.Where(m => m.Email == email).FirstOrDefault().Id;
                IRater    rate    = new LinearRater(-4, 2, 0.5, 1);
                IComparer compare = new CorrelationUserComparer();
                recommender = new UserCollaborativeFilterRecommender(compare, rate, 200);
                UserBehaviorDatabaseParser parser = new UserBehaviorDatabaseParser();
                UserBehaviorDatabase       db1    = parser.LoadUserBehaviorDatabase("/Data/NewBehavior.txt");
                UserBehaviorTransformer    ubt    = new UserBehaviorTransformer(db1);
                recommender.Train(db1);



                int userId;
                int ratings;
                userId  = realid;
                ratings = 2;
                List <Suggestion>         result  = new List <Suggestion>();
                List <RecomendedArticles> rem     = new List <RecomendedArticles>();
                List <Suggestion>         result2 = new List <Suggestion>();

                RecomendedArticles recom;
                if (ratings >= 1 && ratings <= 100)
                {
                    new GetRecommendation {
                        UserID = userId, Ratings = ratings
                    };
                    result  = recommender.GetSuggestions(userId, ratings);
                    result2 = recommender.GetSuggestions(userId, 6);
                }

                foreach (Suggestion suggestion in result)
                {
                    var ye = context.ufiles.Where(m => m.Id == suggestion.ArticleID).FirstOrDefault();
                    recom = new RecomendedArticles()
                    {
                        Name            = ye.Name,
                        UpdatedFileName = ye.UpdatedFileName,
                        UplodedBy       = ye.UplodedBy,
                        Description     = ye.Description,
                        Filename        = ye.Filename,
                        imagepath       = ye.imagepath,
                        UplodedDate     = ye.UplodedDate,
                        Rating          = suggestion.Rating,
                        Id = ye.Id,
                    };
                    rem.Add(recom);
                }
                NRViewModel recomendedArticles = new NRViewModel();

                recomendedArticles.uplodedFiles       = context.ufiles.OrderByDescending(m => m.Id).Take(6).ToList();
                recomendedArticles.RecomendedArticles = rem;
                return(View(recomendedArticles));
            }
            else
            {
                NRViewModel recomendedArticles = new NRViewModel();

                recomendedArticles.uplodedFiles = context.ufiles.OrderByDescending(m => m.Id).Where(m => m.Name.Contains(search)).Take(6).ToList();
                if (recomendedArticles.uplodedFiles == null)
                {
                    ViewBag.messagea = "no item found";
                }
                ViewBag.message = "search";
                return(View(recomendedArticles));
            }
        }