Ejemplo n.º 1
0
        public MainForm()
        {
            InitializeComponent();

            IRater    rate    = new LinearRater(-4, 2, 3, 1);
            IComparer compare = new CorrelationUserComparer();

            recommender = new UserCollaborativeFilterRecommender(compare, rate, 50);

            if (File.Exists(savedModel))
            {
                try
                {
                    recommender.Load(savedModel);
                    rtbOutput.Text = "Loaded model from file";
                    EnableForm(true);
                }
                catch
                {
                    rtbOutput.Text = "Saved model is corrupt";
                }
            }

            //RecommenderTests.TestAllRecommenders();
            //RecommenderTests.FindBestRaterWeights();
        }
        public JsonResult GetSuggestions()
        {
            List <string> products = new List <string>();

            if (User.Identity.IsAuthenticated && User.IsInRole("User"))
            {
                MongodbFunctions           mongo = new MongodbFunctions();
                Databases.DomainModel.User user  = mongo.GetUser(User.Identity.Name);

                RecommendationEngine.Interfaces.IRater    rater    = new LinearRater(1.0, 5.0);
                RecommendationEngine.Interfaces.IComparer comparer = new CosineComparer();
                RecommendationEngine.Recommenders.ItemCollaborativeFilterRecommender recommender1 = new RecommendationEngine.Recommenders.ItemCollaborativeFilterRecommender(comparer, rater, 20);

                RecommendationEngine.Parsers.UserBehaviorDatabaseParser parser  = new RecommendationEngine.Parsers.UserBehaviorDatabaseParser();
                List <Databases.DomainModel.RecommenderAction>          actions = parser.LoadForSearch();
                RecommendationEngine.Parsers.UserBehaviorDatabase       db      = parser.LoadUserBehaviorDatabase(actions);

                recommender1.Train(db);

                List <RecommendationEngine.Objects.Suggestion> suggestions      = new List <RecommendationEngine.Objects.Suggestion>();
                List <Databases.DomainModel.Product>           CategoryProducts = new List <Databases.DomainModel.Product>();


                if (actions.Count(x => x.UserId.Equals(user.Id)) > 0)
                {
                    suggestions = recommender1.GetSuggestions(user.Id, 5);
                }
                else
                {
                    foreach (string subcat in user.Interests)
                    {
                        CategoryProducts.AddRange(mongo.GetCategoryProducts(subcat).Take(2));
                    }

                    foreach (Databases.DomainModel.Product p in CategoryProducts)
                    {
                        if (!products.Exists(x => x.Equals(p.Name)))
                        {
                            products.Add(p.Name);
                        }
                    }
                    suggestions = recommender1.GetFirstSuggestions(db, user, 5);
                }

                foreach (RecommendationEngine.Objects.Suggestion s in suggestions)
                {
                    Databases.DomainModel.Product product = mongo.GetProduct(s.ProductID);
                    if (!products.Exists(x => x.Equals(product.Name)))
                    {
                        products.Add(product.Name);
                    }
                }
            }

            return(Json(new { prods = products }, JsonRequestBehavior.AllowGet));
        }
Ejemplo n.º 3
0
        public static void FindBestRaterWeights()
        {
            using (StreamWriter w = new StreamWriter("rater-weights.csv", true))
            {
                w.WriteLine("down,up,view,dl,rmse,solved,total,precision,rank");
            }

            var once    = new User(0, "");
            var options = new List <dynamic>();

            for (double up = 0.0; up < 5.0; up += 1)
            {
                for (double down = -5.0; down <= 0.0; down += 1)
                {
                    for (double dl = 0.0; dl < 5.0; dl += 1)
                    {
                        for (double view = 0.0; view < 5.0; view += 1)
                        {
                            options.Add(new { up, down, dl, view });
                        }
                    }
                }
            }

            var dbp = new UserBehaviorDatabaseParser();
            var db  = dbp.LoadUserBehaviorDatabase("UserBehaviour.txt");
            var sp  = new DaySplitter(db, 3);
            var cp  = new CorrelationUserComparer();

            Parallel.ForEach(options, set =>
            {
                try
                {
                    var rate = new LinearRater(set.down, set.up, set.view, set.dl);
                    var mfr  = new MatrixFactorizationRecommender(20, rate);
                    //var mfr = new UserCollaborativeFilterRecommender(cp, rate, set.features);

                    mfr.Train(sp.TrainingDB);

                    var score   = mfr.Score(sp.TestingDB, rate);
                    var results = mfr.Test(sp.TestingDB, 100);

                    lock (once)
                    {
                        using (StreamWriter w = new StreamWriter("rater-weights.csv", true))
                        {
                            w.WriteLine(set.down + "," + set.up + "," + set.view + "," + set.dl + "," + score.RootMeanSquareDifference + "," + results.UsersSolved + "," + results.TotalUsers + "," + results.AveragePrecision + "," + results.AverageRecall);
                        }
                    }
                }
                catch (Exception ex)
                {
                    File.WriteAllText("errors.txt", ex.ToString());
                }
            });
        }
Ejemplo n.º 4
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));
        }
Ejemplo n.º 5
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);
            }
        }
Ejemplo n.º 6
0
        public ActionResult Index()
        {
            List <Databases.DomainModel.Product> products = new List <Databases.DomainModel.Product>();
            MongodbFunctions mongo = new MongodbFunctions();

            if (User.Identity.IsAuthenticated && User.IsInRole("User"))
            {
                TimescaledbFunctions tdb = new TimescaledbFunctions();

                Databases.DomainModel.User user = mongo.GetUser(User.Identity.Name);

                if (!tdb.NotificationSent(user.Id.ToString()) && (30000 - tdb.MonthShopping(user.Id.ToString())) < 3000)
                {
                    Databases.DomainModel.Notification notification = new Databases.DomainModel.Notification
                    {
                        Content = "Poštovani, do ostvarivanja popusta od 20% ostalo Vam je manje od 3000 dinara.",
                        Title   = "Mali iznos do popusta",
                        Date    = DateTime.Now.Date,
                        Tag     = "do_popusta",
                        Read    = false,
                        User    = new MongoDB.Driver.MongoDBRef("users", user.Id)
                    };


                    tdb.SendNotification(user.Id.ToString(), mongo.AddNotification(notification, user.Email).ToString(), "do_popusta");
                }

                //recommend za proizvode
                RecommendationEngine.Interfaces.IRater    rater    = new LinearRater(1.0, 5.0);
                RecommendationEngine.Interfaces.IComparer comparer = new CosineComparer();
                RecommendationEngine.Recommenders.ItemCollaborativeFilterRecommender recommender1 = new RecommendationEngine.Recommenders.ItemCollaborativeFilterRecommender(comparer, rater, 3);
                RecommendationEngine.Recommenders.UserCollaborativeFilterRecommender recommender2 = new RecommendationEngine.Recommenders.UserCollaborativeFilterRecommender(comparer, rater, 5);

                RecommendationEngine.Parsers.UserBehaviorDatabaseParser parser  = new RecommendationEngine.Parsers.UserBehaviorDatabaseParser();
                List <Databases.DomainModel.RecommenderAction>          actions = parser.LoadForHome();
                RecommendationEngine.Parsers.UserBehaviorDatabase       db      = parser.LoadUserBehaviorDatabase(actions);

                recommender1.Train(db);
                recommender2.Train(db);

                if (actions.Count(x => x.UserId.Equals(user.Id)) > 0)//if user has actions, recommendation can be done
                {
                    List <RecommendationEngine.Objects.Suggestion> suggestions1 = recommender1.GetSuggestions(user.Id, 6);
                    List <RecommendationEngine.Objects.Suggestion> suggestions2 = recommender2.GetSuggestions(user.Id, 3);

                    foreach (RecommendationEngine.Objects.Suggestion s in suggestions1)
                    {
                        Databases.DomainModel.Product product = mongo.GetProduct(s.ProductID);
                        if (!products.Exists(x => x.Id.Equals(product.Id)))
                        {
                            products.Add(product);
                        }
                    }

                    foreach (RecommendationEngine.Objects.Suggestion s in suggestions2)
                    {
                        Databases.DomainModel.Product product = mongo.GetProduct(s.ProductID);
                        if (!products.Exists(x => x.Id.Equals(product.Id)))
                        {
                            products.Add(product);
                        }
                    }
                }
                else//no actions, recommendation using gender and birth date
                {
                    List <Databases.DomainModel.Product> CategoryProducts = new List <Databases.DomainModel.Product>();

                    foreach (string subcat in user.Interests)
                    {
                        CategoryProducts.AddRange(mongo.GetCategoryProducts(subcat).Take(2));
                    }

                    List <RecommendationEngine.Objects.Suggestion> suggestions1 = recommender1.GetFirstSuggestions(db, user, 10);

                    foreach (RecommendationEngine.Objects.Suggestion s in suggestions1)
                    {
                        Databases.DomainModel.Product product = mongo.GetProduct(s.ProductID);
                        if (!products.Exists(x => x.Id.Equals(product.Id)))
                        {
                            products.Add(product);
                        }
                    }

                    foreach (Databases.DomainModel.Product p in CategoryProducts)
                    {
                        if (!products.Exists(x => x.Id.Equals(p.Id)))
                        {
                            products.Add(p);
                        }
                    }
                }

                //recommend za reklame
                List <Databases.DomainModel.Advert> adverts = new List <Databases.DomainModel.Advert>();

                actions = parser.LoadForAdverts();
                db      = parser.LoadUserBehaviorDatabase(actions);

                recommender1.Train(db);

                List <RecommendationEngine.Objects.Suggestion> suggestionsU     = new List <RecommendationEngine.Objects.Suggestion>();
                List <RecommendationEngine.Objects.Suggestion> suggestionsI     = new List <RecommendationEngine.Objects.Suggestion>();
                List <Databases.DomainModel.Product>           categoryProducts = new List <Databases.DomainModel.Product>();

                if (actions.Count(x => x.UserId.Equals(user.Id)) > 0)
                {
                    suggestionsU = recommender2.GetSuggestions(user.Id, 5);
                    suggestionsI = recommender1.GetSuggestions(user.Id, 5);
                }
                else
                {
                    foreach (string subcat in user.Interests)
                    {
                        categoryProducts.AddRange(mongo.GetCategoryProducts(subcat).Take(2));
                    }

                    foreach (Databases.DomainModel.Product p in categoryProducts)
                    {
                        foreach (Databases.DomainModel.Advert advert in mongo.GetAdverts(p.Subcategory))
                        {
                            if (!adverts.Exists(x => x.Id.Equals(advert.Id)))
                            {
                                adverts.Add(advert);
                            }
                        }
                    }

                    suggestionsI = recommender1.GetFirstSuggestions(db, user, 10);
                }

                foreach (RecommendationEngine.Objects.Suggestion s in suggestionsI)
                {
                    Databases.DomainModel.Product product = mongo.GetProduct(s.ProductID);

                    foreach (Databases.DomainModel.Advert advert in mongo.GetAdverts(product.Subcategory))
                    {
                        if (!adverts.Exists(x => x.Id.Equals(advert.Id)))
                        {
                            adverts.Add(advert);
                        }
                    }
                }

                foreach (RecommendationEngine.Objects.Suggestion s in suggestionsU)
                {
                    Databases.DomainModel.Product product = mongo.GetProduct(s.ProductID);

                    foreach (Databases.DomainModel.Advert advert in mongo.GetAdverts(product.Subcategory))
                    {
                        if (!adverts.Exists(x => x.Id.Equals(advert.Id)))
                        {
                            adverts.Add(advert);
                        }
                    }
                }
                ViewBag.Adverts = adverts;

                //last seen
                List <MongoDB.Bson.ObjectId>         prodIds  = tdb.LastSeen(user.Id.ToString());
                List <Databases.DomainModel.Product> lastSeen = new List <Databases.DomainModel.Product>();

                foreach (MongoDB.Bson.ObjectId id in prodIds)
                {
                    lastSeen.Add(mongo.GetProduct(id));
                }

                tdb.CloseConnection();
                ViewBag.LastSeen = lastSeen;
            }
            else //admin logged
            {
                products = mongo.GetProducts();
            }

            return(View(products));
        }
Ejemplo n.º 7
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));
            }
        }