public void BinaryRecommendationCustomSerializationRegressionTest() { // TODO: We need a static class which implements mapping chainings Rand.Restart(12347); var positiveOnlyMapping = new PositiveOnlyDataMapping(); var negativeDataGeneratorMapping = positiveOnlyMapping.WithGeneratedNegativeData(1.0); using (Stream stream = new MemoryStream()) { negativeDataGeneratorMapping.SaveForwardCompatibleAsBinary(stream); stream.Seek(0, SeekOrigin.Begin); using (var reader = new WrappedBinaryReader(new BinaryReader(stream))) { var deserializedMapping = new NegativeDataGeneratorMapping <PositiveOnlyDataset, Tuple <string, string>, string, string, FeatureProvider, Vector>(reader, positiveOnlyMapping); var recommender = MatchboxRecommender.Create(deserializedMapping); recommender.Train(this.positiveOnlyDataset, this.featureProvider); // must not throw foreach (var instance in positiveOnlyMapping.GetInstances(this.positiveOnlyDataset)) { var user = positiveOnlyMapping.GetUser(this.positiveOnlyDataset, instance); var item = positiveOnlyMapping.GetItem(this.positiveOnlyDataset, instance); Assert.Equal(1, recommender.Predict(user, item, this.featureProvider)); } } } }
/// <summary> /// Computes the number of original observations, positive /// ratings, and negative ratings for each user and item /// </summary> /// <param name="userRatingCounts">A map from each user to their rating counts.</param> /// <param name="itemRatingCounts">A map from each item to its rating counts.</param> private void ComputeRatingCounts( out IDictionary <string, RatingCounts> userRatingCounts, out IDictionary <string, RatingCounts> itemRatingCounts) { Rand.Restart(12347); var positiveOnlyMapping = new PositiveOnlyDataMapping(); var negativeDataGeneratorMapping = positiveOnlyMapping.WithGeneratedNegativeData(1.0); userRatingCounts = new Dictionary <string, RatingCounts>(); itemRatingCounts = new Dictionary <string, RatingCounts>(); // Count the number of positive observations for each user and item. foreach (var instance in positiveOnlyMapping.GetInstances(this.positiveOnlyDataset)) { var user = positiveOnlyMapping.GetUser(this.positiveOnlyDataset, instance); var item = positiveOnlyMapping.GetItem(this.positiveOnlyDataset, instance); RatingCounts ratingCounts; if (!userRatingCounts.TryGetValue(user, out ratingCounts)) { ratingCounts = new RatingCounts(); userRatingCounts.Add(user, ratingCounts); } ++ratingCounts.Original; if (!itemRatingCounts.TryGetValue(item, out ratingCounts)) { ratingCounts = new RatingCounts(); itemRatingCounts.Add(item, ratingCounts); } ++ratingCounts.Original; } // Compute the number of positive and negative ratings generated for each user and item. foreach (var instance in negativeDataGeneratorMapping.GetInstances(this.positiveOnlyDataset)) { var user = negativeDataGeneratorMapping.GetUser(this.positiveOnlyDataset, instance); var item = negativeDataGeneratorMapping.GetItem(this.positiveOnlyDataset, instance); var rating = negativeDataGeneratorMapping.GetRating(this.positiveOnlyDataset, instance); if (rating == 1) { ++userRatingCounts[user].Positive; ++itemRatingCounts[item].Positive; } else if (rating == 0) { ++userRatingCounts[user].Negative; ++itemRatingCounts[item].Negative; } } }
public void BinaryRecommendationRegressionTest() { // TODO: We need a static class which implements mapping chainings Rand.Restart(12347); var positiveOnlyMapping = new PositiveOnlyDataMapping(); var negativeDataGeneratorMapping = positiveOnlyMapping.WithGeneratedNegativeData(1.0); var recommender = MatchboxRecommender.Create(negativeDataGeneratorMapping); recommender.Train(this.positiveOnlyDataset, this.featureProvider); // must not throw foreach (var instance in positiveOnlyMapping.GetInstances(this.positiveOnlyDataset)) { var user = positiveOnlyMapping.GetUser(this.positiveOnlyDataset, instance); var item = positiveOnlyMapping.GetItem(this.positiveOnlyDataset, instance); Assert.Equal(1, recommender.Predict(user, item, this.featureProvider)); } }