Data structure that allows access to selected entries of a rating data structure
Inheritance: Ratings
Exemplo n.º 1
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.º 2
0
    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 = Recommender.CreateRatingPredictor(method);
        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.º 3
0
		/// <summary>Performs user-wise fold-in evaluation, but instead of folding in perform a complete re-training with the new data</summary>
		/// <remarks>
		/// This method can be quite slow.
		/// </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 EvaluateFoldInCompleteRetraining(this RatingPredictor 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 = (RatingPredictor) recommender.Clone();

					var known_ratings = new RatingsProxy(update_data, update_data.ByUser[user_id]);
					local_recommender.Ratings = new CombinedRatings(recommender.Ratings, known_ratings);
					local_recommender.Train();

					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++;
					}
					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;
		}
Exemplo n.º 4
0
		[Test()] public void TestMaxRating()
		{
			var ratings = new RatingsProxy(CreateRatings(), new int[] { 1, 3, 5 });
			Assert.AreEqual(0.6f, ratings.Scale.Max);
		}
Exemplo n.º 5
0
		[Test()] public void TestCount()
		{
			var ratings = new RatingsProxy(CreateRatings(), new int[] { 1, 3, 5 });

			Assert.AreEqual(3, ratings.Count);
		}
Exemplo n.º 6
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]);
		}
Exemplo n.º 7
0
		[Test()] public void TestMaxItemID()
		{
			var ratings = new RatingsProxy(CreateRatings(), new int[] { 1, 3, 5 });
			Assert.AreEqual(8, ratings.MaxItemID);
		}
Exemplo n.º 8
0
		public void TestAdd()
		{
			var ratings = new RatingsProxy(CreateRatings(), new int[] { 1, 3, 5 });

			ratings.Add(7, 5, 0.3f);
		}
Exemplo n.º 9
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.º 10
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.º 11
0
 public void TestMinRating()
 {
     var ratings = new RatingsProxy(CreateRatings(), new int[] { 1, 3, 5 });
     Assert.AreEqual(0.2f, ratings.MinRating);
 }
Exemplo n.º 12
0
 public void TestMaxUserID()
 {
     var ratings = new RatingsProxy(CreateRatings(), new int[] { 1, 3, 5 });
     Assert.AreEqual(3, ratings.MaxUserID);
 }