/// <summary>
        /// Возвращает список наилучших соответствий для человека из словаря prefs.
        /// </summary>
        /// <param name="prefs">Список оценок</param>
        /// <param name="person">Имя критика для которого происходит сравнение</param>
        /// <param name="typeSimilarity">Тип функции подобия</param>
        /// <param name="n">Количество результатов в списке</param>
        /// <returns>Список результатов</returns>
        private static IEnumerable <KeyValuePair <string, decimal> > TopMatches(Dictionary <string, List <RatingFilm> > prefs, string person, Type typeSimilarity, int n = 5)
        {
            var similarity = FactoryDistance.CreateDistance(typeSimilarity, prefs);

            return(prefs.Where(rec => rec.Key != person)
                   .Select(pref => new KeyValuePair <string, decimal>(pref.Key, similarity.SimDistance(pref.Key, person)))
                   .OrderByDescending(x => x.Value)
                   .Take(n)
                   .ToList());
        }
        static void Main(string[] args)
        {
            Console.WriteLine("[1] Евклидово расстояние");
            Console.WriteLine("[2] Корреляции Пирсона");
            Console.WriteLine("[3] Ранжирование критиков 'Евклидово расстояние'");
            Console.WriteLine("[4] Ранжирование критиков 'Корреляции Пирсона'");
            Console.WriteLine("[другое] Выход");

            var ch = Console.ReadKey();

            Console.Clear();

            IDistance distance = null;

            switch (ch.KeyChar)
            {
            case '1':
                distance = FactoryDistance.CreateDistance <EuclideanDistance>(Program.GetCritics());
                break;

            case '2':
                distance = FactoryDistance.CreateDistance <CorrelationPearson>(Program.GetCritics());
                break;

            case '3':
                Program.RankingCritics(typeof(EuclideanDistance), Console.In, Console.Out);
                break;

            case '4':
                Program.RankingCritics(typeof(CorrelationPearson), Console.In, Console.Out);
                break;
            }

            if (distance != null)
            {
                var result = distance.SimDistance("Lisa Rose", "Gene Seymour");
                Console.WriteLine("Результат = {0}", result);
            }

            Console.ReadKey();
        }
        private static IEnumerable <KeyValuePair <string, decimal> > GetRecommendations(Dictionary <string, List <RatingFilm> > prefs, string person, Type typeSimilarity)
        {
            var result = new List <KeyValuePair <string, decimal> >();

            var similarity = FactoryDistance.CreateDistance(typeSimilarity, prefs);

            foreach (var pref in prefs.Where(rec => rec.Key != person))
            {
                var sim = similarity.SimDistance(person, pref.Key);

                // Игнорировать нулевые и отрицательные оценки
                if (sim <= 0)
                {
                    continue;
                }

                // Оценивать только фильмы, которые я еще не смотрел
                foreach (var ratingFilms in pref.Value.Where(item => !prefs[person].Contains(item) || prefs[person].Find(x => x == item).Rating == 0))
                {
                }
            }

            return(result);
        }
Example #4
0
 /// <summary>
 /// Создает указанный вычислитель
 /// </summary>
 /// <typeparam name="T">Тип вычислителя</typeparam>
 /// <param name="critics">Список критиков</param>
 /// <returns>Новый вычислитель</returns>
 public static IDistance CreateDistance <T>(Dictionary <string, List <RatingFilm> > critics) where T : IDistance
 {
     return(FactoryDistance.CreateDistance(typeof(T), critics));
 }