Beispiel #1
0
        /// <summary>
        /// Calculates MAE of items placed to different buckets according to Number ofrating given to them.
        /// </summary>
        /// <param name="trainSource">An instance source</param>
        /// <param name="mapping">Mapping which converts input data to RatingTriples</param>
        /// <param name="predictionErrors">Absolute errors of predictions</param>
        /// <returns></returns>
        private static Dictionary <string, double> CreateItemPopularityPredictions(
            SplitInstanceSource <string> trainSource,
            IRecommenderMapping <SplitInstanceSource <string>, RatingTriple, string, Movie, NoFeatureSource, Vector> mapping,
            Dictionary <Movie, List <double> > predictionErrors)
        {
            Rand.Restart(RandomSeed);

            const int BucketCount = 4;

            var trainingSetCounts = mapping.GetInstances(trainSource)
                                    .GroupBy(i => i.Movie)
                                    .ToDictionary(x => x.Key, x => x.Count());

            var orderedItems = predictionErrors
                               .Keys
                               .Select(x => new { Item = x, Count = GetItemPopularityCount(x, trainingSetCounts) })
                               .OrderBy(x => x.Count)
                               .Select(x => x.Item)
                               .ToArray();

            var result = new Dictionary <string, double>();

            for (var bucket = 0; bucket < BucketCount; ++bucket)
            {
                var items      = GetFixedItems(bucket, orderedItems, trainingSetCounts);
                var bucketName = GetBucketName(items, trainingSetCounts);

                var mae = ComputeMae(items, predictionErrors) / 2.0;
                result.Add(bucketName, mae);
            }

            return(result);
        }