Example #1
0
        /// <summary>
        /// Выполняет кластеризацию указанного набора чисел (в одном измерении) с указанным пороговым значением. Самостоятельно определяет количество кластеров.
        /// </summary>
        /// <param name="Threshold">Пороговое значение</param>
        /// <param name="Data">Набор чисел. Если NULL или пустой, будет выброшено исключение.</param>
        /// <returns></returns>
        public static List<List<Double>> Clusterize(Double Threshold, IEnumerable<Double> Data)
        {
            Data.ThrowIfNullOrEmpty("Набор чисел является NULL", "Набор чисел пуст", "Data");
            if (Data.HasSingle() == true) { return new List<List<Double>>(1) { new List<Double>(1) { Data.Single() } }; }

            List<Double> sorted_data = (from Double x in Data orderby x ascending select x).ToList();
            List<List<Double>> output = new List<List<Double>>();
            List<Double> first_cluster = new List<Double>() { sorted_data[0] };
            output.Add(first_cluster);
            for (Int32 i = 1; i < sorted_data.Count; i++)
            {
                Double current = sorted_data[i];
                if (NumericTools.AreEqual(Threshold, output.ItemFromEnd(0).Last(), current) == true)
                {
                    output.ItemFromEnd(0).Add(current);
                }
                else
                {
                    output.Add(new List<Double>() { current });
                }
            }
            return output.OrderByDescending(item => item.Count).ToList();
        }