/// <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(); }