Как «разумно» собрать коллекцию отсортированных данных?

11

Я пытаюсь разумно отсортировать коллекцию. У меня есть коллекция из частей данных. Но я знаю , что это припадки данных в неравных размеров бункеров. Я не знаю, как правильно выбирать конечные точки для правильного размещения данных. например:nm

Скажем, у меня в коллекции 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

Как правильно выбрать мои контрольные точки для ячеек ?i={13},{49},{1012}

Текущая реализация, которую я имею, разбивает данные на ячейки равномерного размера, а затем берет среднее значение конечных точек, чтобы найти индексы для конца корзин. Так что это работает так:

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-ближайшего соседа, но я не уверен.

Мэтью Кемнетц
источник
1
Не могли бы вы объяснить, что означает «разумно»? Что вы пытаетесь достичь с помощью биннинга? Почему вы биннинг в первую очередь?
whuber
Для вашего второго до последнего абзаца вы имеете в виду , и ? В противном случае это не имеет смысла для меня. <3bin13&<4bin24bin3
gung - Восстановить Монику
Я имею в виду разумно, а не наивно, как я, предполагая, что мусорные ведра были равномерно распределены. если часть данных попадает в определенную ячейку, которая говорит мне кое-что очень важное об этой части данных. Я сортирую данные, чтобы определить индексы разбиения бункера, а затем решаю, в какой бункер попадает каждый фрагмент данных по отдельности.
Мэтью Кемнетц
если я не сделал что-то не так в своем усреднении, я думаю, что это правильно выбрав четные ячейки, все мои конечные точки равны 3. Поэтому я не могу правильно хранить свои данные. Вот почему моя реализация ломается без четных интервалов.
Мэтью Кемнетц
Вот что я сделал в немного другой обстановке.
Макрос

Ответы:

9

Я думаю, что вы хотите сделать, это называется кластеризацией. Вы хотите сгруппировать ваши «Значения» так, чтобы аналогичные значения собирались в одном и том же бункере, а количество общих бинов задано заранее.

Вы можете решить эту проблему, используя алгоритм кластеризации k-средних . В MATLAB вы можете сделать это:

bin_ids = kmeans(Values,3); 

Вышеупомянутый вызов сгруппирует значения в Valuesтри группы, так что дисперсия внутри группы будет минимальной.

emrea
источник
1
Я тоже это выяснил. Это именно то, что я реализовал, и это сработало превосходно. Я пришел сюда, чтобы ответить на свой вопрос, но вы меня опередили! Я пытался делать кластеризацию.
Мэтью Кемнетц
8

К-среднее является опцией, но это не очень разумно для одномерных данных. В одномерных данных у вас есть одно огромное преимущество: данные могут быть полностью отсортированы.

Взгляните на оптимизацию естественных разрывов :
http://en.wikipedia.org/wiki/Jenks_natural_breaks_optimization

ВЫЙТИ - Anony-Mousse
источник
Это чрезвычайно интересно. Не могли бы вы подробнее рассказать о том, почему это лучше, чем k означает?
Мэтью Кемнетц
Основная причина, по которой я спрашиваю, заключается в том, что я использую MATLAB для своего алгоритма, и я не смог найти оптимизацию естественных разрывов Дженкса ни в каких наборах инструментов и т. Д., Поэтому мне нужно будет реализовать свою собственную. Я просто хотел знать, насколько лучше / быстрее это может быть, прежде чем переключать передачи и реализовывать это.
Мэтью Кемнетц
1
К-значит довольно глупо. Он имеет средство, и он всегда будет разделен в середине двух средств. Например, с учетом 0 1 2 3 4 5 7 7 7, k-means предпочитает делиться между 4 и 5. Иногда он даже делится между 3 и 4.
Имеет QUIT - Anony-Mousse