Exemplo n.º 1
0
        [Test()] public void TestRemoveItem()
        {
            var ratings = new RatingsProxy(CreateRatings(), Enumerable.Range(0, 8).ToList());

            Assert.AreEqual(8, ratings.Count);
            Assert.AreEqual(0.2f, ratings[2, 4]);
            Assert.AreEqual(2, ratings.ByUser[1].Count);
            Assert.AreEqual(3, ratings.ByUser[2].Count);
            Assert.AreEqual(2, ratings.ByUser[3].Count);
            Assert.AreEqual(2, ratings.CountByUser[1]);
            Assert.AreEqual(3, ratings.CountByUser[2]);
            Assert.AreEqual(2, ratings.CountByUser[3]);

            ratings.RemoveItem(4);
            Assert.AreEqual(6, ratings.Count);
            Assert.AreEqual(1, ratings.ByUser[1].Count);
            Assert.AreEqual(2, ratings.ByUser[2].Count);
            Assert.AreEqual(1, ratings.CountByUser[1]);
            Assert.AreEqual(2, ratings.CountByUser[2]);

            float r;

            Assert.IsFalse(ratings.TryGet(1, 4, out r));
            Assert.IsFalse(ratings.TryGet(2, 4, out r));
            Assert.IsFalse(ratings.TryGet(3, 4, out r));
        }
Exemplo n.º 2
0
        [Test()] public void TestRemoveAt()
        {
            var ratings = new RatingsProxy(CreateRatings(), Enumerable.Range(0, 8).ToList());

            Assert.AreEqual(8, ratings.Count);
            Assert.AreEqual(0.4f, ratings[2, 5]);
            Assert.AreEqual(3, ratings.ByUser[2].Count);
            Assert.AreEqual(1, ratings.ByUser[6].Count);
            Assert.AreEqual(2, ratings.ByItem[3].Count);
            Assert.AreEqual(1, ratings.ByItem[5].Count);
            Assert.AreEqual(3, ratings.CountByUser[2]);
            Assert.AreEqual(1, ratings.CountByUser[6]);
            Assert.AreEqual(2, ratings.CountByItem[3]);
            Assert.AreEqual(1, ratings.CountByItem[5]);

            ratings.RemoveAt(ratings.GetIndex(2, 5));
            Assert.AreEqual(7, ratings.Count);
            Assert.AreEqual(2, ratings.ByUser[2].Count);
            Assert.AreEqual(0, ratings.ByItem[5].Count);
            Assert.AreEqual(2, ratings.CountByUser[2]);
            Assert.AreEqual(0, ratings.CountByItem[5]);

            ratings.RemoveAt(ratings.GetIndex(6, 3));
            Assert.AreEqual(6, ratings.Count);
            Assert.AreEqual(0, ratings.ByUser[6].Count);
            Assert.AreEqual(1, ratings.ByItem[3].Count);
            Assert.AreEqual(0, ratings.CountByUser[6]);
            Assert.AreEqual(1, ratings.CountByItem[3]);

            float r;

            Assert.IsFalse(ratings.TryGet(2, 5, out r));
        }
Exemplo n.º 3
0
        [Test()] public void TestRemoveUser()
        {
            var ratings = new RatingsProxy(CreateRatings(), Enumerable.Range(0, 8).ToList());

            Assert.AreEqual(8, ratings.Count);
            Assert.AreEqual(0.4f, ratings[2, 5]);
            Assert.AreEqual(1, ratings.ByItem[2].Count);
            Assert.AreEqual(2, ratings.ByItem[4].Count);
            Assert.AreEqual(1, ratings.ByItem[5].Count);
            Assert.AreEqual(1, ratings.CountByItem[2]);
            Assert.AreEqual(2, ratings.CountByItem[4]);
            Assert.AreEqual(1, ratings.CountByItem[5]);

            ratings.RemoveUser(2);
            Assert.AreEqual(5, ratings.Count);
            Assert.AreEqual(0, ratings.ByItem[2].Count);
            Assert.AreEqual(1, ratings.ByItem[4].Count);
            Assert.AreEqual(0, ratings.ByItem[5].Count);
            Assert.AreEqual(0, ratings.CountByItem[2]);
            Assert.AreEqual(1, ratings.CountByItem[4]);
            Assert.AreEqual(0, ratings.CountByItem[5]);

            float rating;

            Assert.IsFalse(ratings.TryGet(2, 5, out rating));
            Assert.IsFalse(ratings.TryGet(2, 4, out rating));
            Assert.IsFalse(ratings.TryGet(2, 2, out rating));
        }
Exemplo n.º 4
0
        /*
         * [Test()]
         * [ExpectedException(typeof(NotSupportedException))]
         * public void TestRemoveAt()
         * {
         *      var ratings = new CombinedRatings(CreateRatings1(), CreateRatings2());
         *
         *      ratings.RemoveAt(ratings.GetIndex(2, 5));
         *      Assert.AreEqual(CreateRatings1().Count + CreateRatings2().Count - 1, ratings.Count);
         *      double r;
         *      Assert.IsFalse(ratings.TryGet(2, 5, out r));
         *
         *      ratings.RemoveAt(ratings.GetIndex(7, 9));
         *      Assert.AreEqual(CreateRatings1().Count + CreateRatings2().Count - 2, ratings.Count);
         *      Assert.IsFalse(ratings.TryGet(7, 9, out r));
         * }
         *
         * [Test()]
         * [ExpectedException(typeof(NotSupportedException))]
         * public void TestRemoveUser()
         * {
         *      var ratings = new CombinedRatings(CreateRatings1(), CreateRatings2());
         *
         *      ratings.RemoveUser(2);
         * }
         *
         * [Test()]
         * [ExpectedException(typeof(NotSupportedException))]
         * public void TestRemoveItem()
         * {
         *      var ratings = new CombinedRatings(CreateRatings1(), CreateRatings2());
         *
         *      ratings.RemoveItem(5);
         * }
         */

        [Test()] public void TestIndex()
        {
            var ratings = new RatingsProxy(CreateRatings(), new int[] { 1, 3, 5 });

            // test index[,]
            Assert.AreEqual(0.2f, ratings[1, 8]);
            Assert.AreEqual(0.6f, ratings[2, 2]);
            Assert.AreEqual(0.2f, ratings[3, 7]);
        }
        /// <summary>Performs user-wise fold-in evaluation, but instead of folding in perform incremental training with the new data</summary>
        /// <remarks>
        /// </remarks>
        /// <returns>the evaluation results</returns>
        /// <param name='recommender'>a rating predictor capable of performing a user fold-in</param>
        /// <param name='update_data'>the rating data used to represent the users</param>
        /// <param name='eval_data'>the evaluation data</param>
        static public RatingPredictionEvaluationResults EvaluateFoldInIncrementalTraining(this IncrementalRatingPredictor recommender, IRatings update_data, IRatings eval_data)
        {
            double rmse = 0;
            double mae  = 0;
            double cbd  = 0;

            int rating_count = 0;

            foreach (int user_id in update_data.AllUsers)
            {
                if (eval_data.AllUsers.Contains(user_id))
                {
                    var local_recommender = (IncrementalRatingPredictor)recommender.Clone();

                    // add ratings and perform incremental training
                    var user_ratings = new RatingsProxy(update_data, update_data.ByUser[user_id]);
                    local_recommender.AddRatings(user_ratings);

                    var items_to_rate     = (from index in eval_data.ByUser[user_id] select eval_data.Items[index]).ToArray();
                    var predicted_ratings = recommender.Recommend(user_id, candidate_items: items_to_rate);

                    foreach (var pred in predicted_ratings)
                    {
                        float prediction    = pred.Item2;
                        float actual_rating = eval_data.Get(user_id, pred.Item1, eval_data.ByUser[user_id]);
                        float error         = prediction - actual_rating;

                        rmse += error * error;
                        mae  += Math.Abs(error);
                        cbd  += Eval.Ratings.ComputeCBD(actual_rating, prediction, recommender.MinRating, recommender.MaxRating);
                        rating_count++;
                    }

                    // remove ratings again
                    local_recommender.RemoveRatings(user_ratings);

                    Console.Error.Write(".");
                }
            }

            mae  = mae / rating_count;
            rmse = Math.Sqrt(rmse / rating_count);
            cbd  = cbd / rating_count;

            var result = new RatingPredictionEvaluationResults();

            result["RMSE"] = (float)rmse;
            result["MAE"]  = (float)mae;
            result["NMAE"] = (float)mae / (recommender.MaxRating - recommender.MinRating);
            result["CBD"]  = (float)cbd;
            return(result);
        }
    public static void Main(string[] args)
    {
        // TODO add random seed
        // TODO report per-user times

        string data_file      = args[0];
        string method         = args[1];
        string options        = args[2];
        int    num_test_users = int.Parse(args[3]);

        // load the data
        var all_data = RatingData.Read(data_file);

        // TODO randomize
        var test_users = new HashSet <int>(Enumerable.Range(0, num_test_users));

        var update_indices = new List <int>();
        var eval_indices   = new List <int>();

        foreach (int user_id in test_users)
        {
            if (all_data.ByUser[user_id].Count > 1)
            {
                var user_indices = all_data.ByUser[user_id];
                for (int i = 0; i < user_indices.Count - 1; i++)
                {
                    update_indices.Add(user_indices[i]);
                }
                for (int i = user_indices.Count - 1; i < user_indices.Count; i++)
                {
                    eval_indices.Add(user_indices[i]);
                }
            }
        }

        var training_indices = new List <int>();

        for (int i = 0; i < all_data.Count; i++)
        {
            if (!test_users.Contains(all_data.Users[i]))
            {
                training_indices.Add(i);
            }
        }
        var training_data = new MyMediaLite.Data.Ratings();

        foreach (int i in training_indices)
        {
            training_data.Add(all_data.Users[i], all_data.Items[i], all_data[i]);
        }

        var update_data = new RatingsProxy(all_data, update_indices);
        var eval_data   = new RatingsProxy(all_data, eval_indices);

        Console.Write(training_data.Statistics());
        Console.Write(update_data.Statistics());
        Console.Write(eval_data.Statistics());

        // prepare recommender
        RatingPredictor recommender = method.CreateRatingPredictor();

        recommender.Configure(options);
        recommender.Ratings = training_data;
        Console.WriteLine(string.Format(CultureInfo.InvariantCulture, "ratings range: [{0}, {1}]", recommender.MinRating, recommender.MaxRating));
        Console.WriteLine("recommender: {0}", recommender);
        recommender.Train();

        // I. complete retraining
        Console.WriteLine(
            "complete training: {0}",
            recommender.EvaluateFoldInCompleteRetraining(update_data, eval_data));

        // II. online updates
        Console.WriteLine(
            "incremental training: {0}",
            ((IncrementalRatingPredictor)recommender).EvaluateFoldInIncrementalTraining(update_data, eval_data));

        // III. fold-in
        Console.WriteLine(
            "fold-in: {0}",
            ((IFoldInRatingPredictor)recommender).EvaluateFoldIn(update_data, eval_data));
    }
Exemplo n.º 7
0
        [Test()] public void TestCount()
        {
            var ratings = new RatingsProxy(CreateRatings(), new int[] { 1, 3, 5 });

            Assert.AreEqual(3, ratings.Count);
        }
Exemplo n.º 8
0
        [Test()] public void TestMaxRating()
        {
            var ratings = new RatingsProxy(CreateRatings(), new int[] { 1, 3, 5 });

            Assert.AreEqual(0.6f, ratings.Scale.Max);
        }
Exemplo n.º 9
0
        [Test()] public void TestMaxItemID()
        {
            var ratings = new RatingsProxy(CreateRatings(), new int[] { 1, 3, 5 });

            Assert.AreEqual(8, ratings.MaxItemID);
        }
Exemplo n.º 10
0
        public void TestAdd()
        {
            var ratings = new RatingsProxy(CreateRatings(), new int[] { 1, 3, 5 });

            ratings.Add(7, 5, 0.3f);
        }