Пример #1
0
        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));
                    }
                }
            }
        }
Пример #2
0
        /// <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;
                }
            }
        }
Пример #3
0
        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));
            }
        }