Я пытаюсь разумно отсортировать коллекцию. У меня есть коллекция из частей данных. Но я знаю , что это припадки данных в неравных размеров бункеров. Я не знаю, как правильно выбирать конечные точки для правильного размещения данных. например:
Скажем, у меня в коллекции 12 предметов, и я знаю, что данные поместятся в 3 корзины:
Index: 1 2 3 4 5 6 7 8 9 10 11 12
Value: 1 1 1 3 3 3 3 3 3 5 5 6
Как правильно выбрать мои контрольные точки для ячеек ?
Текущая реализация, которую я имею, разбивает данные на ячейки равномерного размера, а затем берет среднее значение конечных точек, чтобы найти индексы для конца корзин. Так что это работает так:
Index: 1 2 3 4 5 6 7 8 9 10 11 12
Value: 1 1 1 3 3 3 3 3 3 5 5 6
first break evenly: i = 1-4, 5-8, 9-12
mean endpoints: between 4 and 5: (3+3)/2 = 3
between 8 and 9: (3+3)/2 = 3
Итак, теперь все, что ниже 3, помещается в корзину 1, все, что выше 3, но ниже 3, помещается в корзину 2, а все, что выше 3, помещается в корзину 3. Вы можете видеть, в чем заключается моя проблема. Если данные имеют неравные ячейки, мой метод завершится неудачно.
Друг упомянул алгоритм k-ближайшего соседа, но я не уверен.
источник
Ответы:
Я думаю, что вы хотите сделать, это называется кластеризацией. Вы хотите сгруппировать ваши «Значения» так, чтобы аналогичные значения собирались в одном и том же бункере, а количество общих бинов задано заранее.
Вы можете решить эту проблему, используя алгоритм кластеризации k-средних . В MATLAB вы можете сделать это:
Вышеупомянутый вызов сгруппирует значения в
Values
три группы, так что дисперсия внутри группы будет минимальной.источник
К-среднее является опцией, но это не очень разумно для одномерных данных. В одномерных данных у вас есть одно огромное преимущество: данные могут быть полностью отсортированы.
Взгляните на оптимизацию естественных разрывов :
http://en.wikipedia.org/wiki/Jenks_natural_breaks_optimization
источник