public static void Main(string[] args)
    {
        // load the data
        var training_data = RatingData.Read(args[0]);
        var test_data     = RatingData.Read(args[1]);

        // set up the recommender
        var recommender = new UserItemBaseline();

        recommender.Ratings = training_data;
        recommender.Train();

        // measure the accuracy on the test data set
        var results = recommender.Evaluate(test_data);

        Console.WriteLine("RMSE={0} MAE={1}", results["RMSE"], results["MAE"]);
        Console.WriteLine(results);

        // make a prediction for a certain user and item
        Console.WriteLine(recommender.Predict(1, 1));

        var bmf = new BiasedMatrixFactorization {
            Ratings = training_data
        };

        Console.WriteLine(bmf.DoCrossValidation());
    }
Exemplo n.º 2
0
        public static void BiasedMatrixFactorizationTest()
        {
            List <Rating> baseRatings = Tools.GetRatings(BaseRatingFile, " ");
            List <Rating> testRatings = Tools.GetRatings(TestRatingFile, " ");

            BiasedMatrixFactorization model = new BiasedMatrixFactorization(MaxUserId, MaxItemId);

            model.TrySGD(baseRatings, testRatings, 100, 0.005, 0.02, 0.98);
        }
        public void TestDefaultBehaviorIsNoDecay()
        {
            var mf = new BiasedMatrixFactorization()
            {
                LearnRate = 1.1f, NumIter = 10, Ratings = TestUtils.CreateRatings()
            };

            mf.Train();
            Assert.AreEqual(1.1f, mf.current_learnrate);
        }
Exemplo n.º 4
0
        public static void BiasedMatrixFactorizationTest(double testSize = 0.1)
        {
            List <Rating>             ratings   = Tools.GetRatings(RatingFile, ",");
            var                       max       = Tools.GetMaxUserIdAndItemId(ratings);
            var                       maxUserId = max.Item1 + 1;
            var                       maxItemId = max.Item2 + 1;
            BiasedMatrixFactorization model     = new BiasedMatrixFactorization(maxUserId, maxItemId);
            var                       t         = Tools.TrainTestSplit(ratings, testSize);

            model.TrySGD(t.Item1, t.Item2, 100, 0.005);
        }
        public void TestCurrentLearnRate()
        {
            var mf = new BiasedMatrixFactorization()
            {
                LearnRate = 1.1f, Ratings = TestUtils.CreateRatings()
            };

            mf.InitModel();
            Assert.AreEqual(1.1f, mf.LearnRate);
            Assert.AreEqual(1.1f, mf.current_learnrate);
        }
Exemplo n.º 6
0
        public static void BiasedMatrixFactorizationTest(double testSize = 0.1)
        {
            List <Rating> ratings = Tools.GetRatings(DefaultRatingFile, "::");

            Tools.UpdateIndexesToZeroBased(ratings);

            var t = Tools.TrainTestSplit(ratings, testSize);

            BiasedMatrixFactorization model = new BiasedMatrixFactorization(MaxUserId, MaxItemId);

            model.TrySGD(t.Item1, t.Item2, 100, 0.005);
        }
Exemplo n.º 7
0
        public static void BiasedMatrixFactorizationTest()
        {
            List <Rating> baseRatings = Tools.GetRatings(BaseRatingFile);
            List <Rating> testRatings = Tools.GetRatings(TestRatingFile);

            Tools.UpdateIndexesToZeroBased(baseRatings);
            Tools.UpdateIndexesToZeroBased(testRatings);

            BiasedMatrixFactorization model = new BiasedMatrixFactorization(MaxUserId, MaxItemId);

            model.TrySGD(baseRatings, testRatings, 100, 0.01, 0.01, 0.95);
        }
Exemplo n.º 8
0
        // 2017.10.26
        public static void BiasedMatrixFactorizationTopNTest(double testSize = 0.125)
        {
            List <Rating> ratings = Tools.GetRatings(DefaultRatingFile, "::");

            Tools.UpdateIndexesToZeroBased(ratings);
            var data        = Tools.TrainTestSplit(ratings, testSize);
            var baseSamples = Tools.RandomSelectNegativeSamples(data.Item1, 1, true);

            BiasedMatrixFactorization model = new BiasedMatrixFactorization(MaxUserId, MaxItemId, 100);

            model.TrySGDForTopN(baseSamples, data.Item2, 100, 0.02, 0.01, 0.9);
        }
Exemplo n.º 9
0
        /// <summary>
        /// Predict the rating of the item by users
        /// </summary>
        private static void PredictRating(string[] args)
        {
            Console.WriteLine("Predicting ratings for Users...");
            String outputFile = Path.Combine(args[2], outputFileForRatings);

            testingFile         = Path.Combine(args[1], testingFile);
            testingFileModified = Path.Combine(args[2], testingFileModified);
            ModifyTestingFileForRating(testingFile, testingFileModified);

            float minRating = 1;
            float maxRating = 5;

            var userMapping     = new Mapping();
            var itemMapping     = new Mapping();
            var trainingData    = StaticRatingData.Read(trainingCompactFileForRatings, userMapping, itemMapping, RatingType.FLOAT, TestRatingFileFormat.WITH_RATINGS, false);
            var testUsers       = trainingData.AllUsers; // users that will be taken into account in the evaluation
            var candidate_items = trainingData.AllItems; // items that will be taken into account in the evaluation
            var testData        = StaticRatingData.Read(testingFileModified, userMapping, itemMapping, RatingType.FLOAT, TestRatingFileFormat.WITH_RATINGS, false);

            var recommender = new BiasedMatrixFactorization();

            recommender.MinRating = minRating;
            recommender.MaxRating = maxRating;
            recommender.Ratings   = trainingData;

            recommender.NumFactors = 30;
            recommender.NumIter    = 100;
            recommender.RegI       = 0.04F;
            recommender.RegU       = 0.04F;
            //recommender.BiasReg = 0.09F;
            recommender.FrequencyRegularization = true;
            recommender.BoldDriver = true;
            recommender.LearnRate  = 0.07F;

            Stopwatch timeKeeper = new Stopwatch();

            timeKeeper.Start();
            recommender.Train();
            timeKeeper.Stop();
            Console.WriteLine("time passed for training rating prediction model: " + timeKeeper.ElapsedMilliseconds);
            // measure the accuracy on the test data set

            timeKeeper = new Stopwatch();
            timeKeeper.Start();
            var results = recommender.Evaluate(testData);

            timeKeeper.Stop();
            Console.WriteLine("time passed for rating prediction: " + timeKeeper.ElapsedMilliseconds);
            Console.WriteLine("RMSE={0}", results["RMSE"]);

            recommender.WritePredictions(testData, outputFile, userMapping, itemMapping, "{0}-{1},{2}", "userID-itemID,rating");
        }
        public void TestMatrixInit()
        {
            var mf = new BiasedMatrixFactorization()
            {
                Ratings = TestUtils.CreateRatings()
            };

            mf.InitModel();
            Assert.IsNotNull(mf.user_factors);
            Assert.IsNotNull(mf.item_factors);
            Assert.IsNotNull(mf.user_bias);
            Assert.IsNotNull(mf.item_bias);
        }
        public void TestDecay()
        {
            var mf = new BiasedMatrixFactorization()
            {
                LearnRate = 1.0f, Decay = 0.5f,
                NumIter   = 1, Ratings = TestUtils.CreateRatings()
            };

            mf.Train();
            Assert.AreEqual(0.5f, mf.current_learnrate);

            mf.Iterate();
            Assert.AreEqual(0.25f, mf.current_learnrate);
        }
        public void TestIncrementalUpdates()
        {
            var mf = new BiasedMatrixFactorization()
            {
                Ratings = TestUtils.CreateRatings(), FrequencyRegularization = true
            };

            mf.Train();

            var new_ratings = new Ratings();

            new_ratings.Add(mf.MaxUserID + 1, mf.MaxItemID + 1, 3f);
            mf.AddRatings(new_ratings);
        }
Exemplo n.º 13
0
    private void CreateRecommender()
    {
        BiasedMatrixFactorization recommender = new BiasedMatrixFactorization();

        Console.Error.Write("Reading in ratings ... ");
        TimeSpan time = Utils.MeasureTime(delegate() {
            recommender.Ratings = RatingPrediction.Read(ratings_file, user_mapping, item_mapping);
        });

        Console.Error.WriteLine("done ({0,0:0.##}).", time.TotalSeconds.ToString(CultureInfo.InvariantCulture));

        //Console.Error.Write("Reading in additional ratings ... ");
        //string[] rating_files = Directory.GetFiles("../../saved_data/", "user-ratings-*");
        //Console.Error.WriteLine("done.");

        foreach (var indices_for_item in recommender.Ratings.ByItem)
        {
            if (indices_for_item.Count > 0)
            {
                movies_by_frequency.Add(new WeightedItem(recommender.Ratings.Items[indices_for_item[0]], indices_for_item.Count));
            }
        }
        movies_by_frequency.Sort();
        movies_by_frequency.Reverse();
        for (int i = 0; i < n_movies; i++)
        {
            top_n_movies.Add(movies_by_frequency[i].item_id);
        }

        Console.Error.Write("Loading prediction model ... ");
        recommender.UpdateUsers    = true;
        recommender.UpdateItems    = false;
        recommender.BiasReg        = 0.001;
        recommender.Regularization = 0.045;
        recommender.NumIter        = 60;
        time = Utils.MeasureTime(delegate() {
            recommender.LoadModel(model_file);
        });
        Console.Error.WriteLine("done ({0,0:0.##}).", time.TotalSeconds.ToString(CultureInfo.InvariantCulture));

        rating_predictor = recommender;

        current_user_id = user_mapping.ToInternalID(current_user_external_id);
        //rating_predictor.AddUser(current_user_id);

        // add movies that were not in the training set
        //rating_predictor.AddItem( item_mapping.InternalIDs.Count - 1 );

        PredictAllRatings();
    }
Exemplo n.º 14
0
        public static void MatrixFactorization_IJCAI2018_Test2()
        {
            double        testSize = 0.2;
            List <Rating> ratings  = Tools.GetRatings(@"D:\data\ijcai2018task\ex\train.shop.csv", ",");

            var data = Tools.TrainTestSplit(ratings, testSize);
            var max  = Tools.GetMaxUserIdAndItemId(ratings);

            Tools.WriteRatings(data.Item1, @"D:\data\ijcai2018task\ex\train.shop.1.csv");
            Tools.WriteRatings(data.Item2, @"D:\data\ijcai2018task\ex\train.shop.2.csv");

            BiasedMatrixFactorization model = new BiasedMatrixFactorization(max.Item1 + 1, max.Item2 + 1, 100);

            model.TrySGD(data.Item1, data.Item2, 100, 0.01, 0.01, 0.94, 0, 1);
        }
        public void TestFoldIn()
        {
            var mf = new BiasedMatrixFactorization()
            {
                Ratings = TestUtils.CreateRatings()
            };

            mf.Train();
            var user_ratings = new List <Tuple <int, float> >();

            user_ratings.Add(new Tuple <int, float>(0, 4.0f));
            var candidate_items = new List <int> {
                0, 1
            };                                                        // have a known and an unknown item
            var results = mf.ScoreItems(user_ratings, candidate_items);

            Assert.AreEqual(2, results.Count);
        }
Exemplo n.º 16
0
        public static void BiasedMatrixFactorization(Dictionary <string, string> pairs)
        {
            string separator = "\t";

            if (pairs.Keys.Contains("separator"))
            {
                separator = pairs["separator"];
            }

            List <Rating> baseRatings = Tools.GetRatings(pairs["train"], separator);
            List <Rating> testRatings = Tools.GetRatings(pairs["test"], separator);

            int maxUserId = System.Math.Max(baseRatings.Max(r => r.UserId), testRatings.Max(r => r.UserId));
            int maxItemId = System.Math.Max(baseRatings.Max(r => r.ItemId), testRatings.Max(r => r.ItemId));

            Tools.UpdateIndexesToZeroBased(baseRatings);
            Tools.UpdateIndexesToZeroBased(testRatings);

            int f = 10;

            if (pairs.Keys.Contains("f"))
            {
                f = Int32.Parse(pairs["f"]);
            }

            int epochs = 100;

            if (pairs.Keys.Contains("epochs"))
            {
                epochs = Int32.Parse(pairs["epochs"]);
            }

            double gamma = 0.01;

            if (pairs.Keys.Contains("gamma"))
            {
                gamma = Double.Parse(pairs["gamma"]);
            }

            double lambda = 0.01;

            if (pairs.Keys.Contains("lambda"))
            {
                lambda = Double.Parse(pairs["lambda"]);
            }

            double min_rating = 1.0;

            if (pairs.Keys.Contains("min_rating"))
            {
                min_rating = Double.Parse(pairs["min_rating"]);
            }

            double max_rating = 5.0;

            if (pairs.Keys.Contains("max_rating"))
            {
                max_rating = Double.Parse(pairs["max_rating"]);
            }

            BiasedMatrixFactorization model = new BiasedMatrixFactorization(maxUserId, maxItemId, f);

            model.TrySGD(baseRatings, testRatings, epochs, gamma, lambda, min_rating, max_rating);
        }