[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)); }
[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)); }
[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)); }
/* * [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)); }
[Test()] public void TestCount() { var ratings = new RatingsProxy(CreateRatings(), new int[] { 1, 3, 5 }); Assert.AreEqual(3, ratings.Count); }
[Test()] public void TestMaxRating() { var ratings = new RatingsProxy(CreateRatings(), new int[] { 1, 3, 5 }); Assert.AreEqual(0.6f, ratings.Scale.Max); }
[Test()] public void TestMaxItemID() { var ratings = new RatingsProxy(CreateRatings(), new int[] { 1, 3, 5 }); Assert.AreEqual(8, ratings.MaxItemID); }
public void TestAdd() { var ratings = new RatingsProxy(CreateRatings(), new int[] { 1, 3, 5 }); ratings.Add(7, 5, 0.3f); }