Кластеризация при попытке минимизировать запасную емкость - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь сгруппировать ~ 30 миллионов точек (координаты x и y) в кластеры - добавление, которое усложняет задачу, заключается в том, что я пытаюсь минимизировать запасную емкость каждого кластера, одновременно обеспечиваямаксимальное расстояние между кластером и какой-либо одной точкой невелико (> 5 км или около того).

Каждый кластер состоит из оборудования, которое может обслуживать 64 балла, если кластер содержит менее 65 баллов, тогда нам нужен одиниз этих единиц оборудования.Однако, если кластер содержит 65 точек, нам нужно два из этих единиц оборудования, это означает, что у нас есть запасная емкость 63 для этого кластера.Нам также необходимо подключить каждую точку к кластеру, поэтому расстояние от каждой точки до кластера также является фактором стоимости оборудования.

В конечном итоге я пытаюсь минимизировать стоимость оборудования, которое кажетсяэквивалентная проблема минимизации средней резервной мощности, а также обеспечение того, чтобы расстояние от кластера до какой-либо одной точки было менее 5 км (приблизительное значение, но оно подойдет для мысленного эксперимента - возможно, существуют более эффективные способы наложения этого ограничения).

Я пробовал несколько подходов:

  • K-означает
    • Большинство должно знать, как это работает
    • Средняя запасная емкость 32
    • Работает в O (n ^ 2)
  • Сортированный список расстояний ab
    • Я попробовал альтернативный подход, подобный так:
      1. Инициализировать точки кластера случайным образомвыбор точек из данных
      2. Определение матрицы расстояний между каждой точкой и каждым кластером
      3. Сведение его в список
      4. Сортировкаlist
      5. Переход от наименьшего к наибольшему расстоянию, назначая точки кластерам
      6. Назначайте точки кластеров, пока они не достигнут 64, тогда больше нельзя назначать
      7. Прекратить повторять список один раз всеточки были назначены
      8. Обновление центроида кластера на основе назначенных точек
      9. Повторяйте шаги 1 - 7 до тех пор, пока места кластера не сойдутся (как в K-средних)
      10. Собрать кластерместоположения, расположенные рядом в одном кластере
    • Средняя резервная емкость приблизительно равна 0, по расчету
    • Это хорошо сработало для моего набора тестовых данных, но как толькоЯ расширил до полного набора (30 миллионов точек), это заняло слишком много времени, вероятно, потому что мы должны отсортировать полный список O(NlogN), а затем перебрать его, пока все точки не будут назначены O(NK), а затем повторить это до сходимости
  • Линейное программирование
    • Это было довольно просто реализовать с использованием библиотек, но и снова заняло слишком много временииз-за сложности

Я открыт для любых предложений о возможных алгоритмах / языках, которые лучше всего подходят для этого.У меня есть опыт машинного обучения, но я не мог придумать очевидного способа сделать это, используя это.

Дайте мне знать, если я пропустил какую-либо информацию.

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Пусть p = ceil (N / 64).

Это оптимальное количество оборудования.

Пусть s = ceil (sqrt (p)).

Сортировать данные по оси х.Нарезать данные на кусочки по 64 * s записей каждый (но последний слайд).

В каждом срезе сортировать данные по оси y.Возьмите 64 предмета каждый и назначьте их одному оборудованию.Легко видеть, что все, кроме, возможно, последнего оборудования используются оптимально и близко.

Сортировка настолько невероятно дешева, что это будет очень быстро.Попробуйте, и вы, вероятно, будете удивлены компромиссом между качеством и временем выполнения!Я не удивлюсь, если он найдет конкурентные результаты для большинства из тех, что вы пробовали, за исключением подхода ЛП, и он запустится всего за несколько секунд.

В качестве альтернативы: сортируйте все объекты по их координате кривой Гильберта.Разбейте на p разделы, назначьте одно оборудование каждому.

Второе намного сложнее реализовать и, вероятно, медленнее.Иногда это может быть лучше, но иногда и хуже.

Если вам важнее расстояние, попробуйте следующую стратегию: создайте пространственный индекс (например, kd-tree или, если у вас есть Haversine, R *)-tree).Для каждой точки найдите 63 ближайших соседей и сохраните их.Сортировать по расстоянию по убыванию.Это даст вам оценку «сложности».Теперь не размещайте снаряжение в самой трудной точке, а рядом - у соседа с наименьшим максимумом (расстояние до трудной точки, расстояние до 63 ближайшего соседа).Повторите это для нескольких пунктов, но после примерно 10% данных, начните снова всю процедуру с оставшимися точками.Проблема в том, что вы не очень точно указали, когда предпочитаете, чтобы расстояния были небольшими, даже при использовании большего количества оборудования ... Вы можете включить это, рассматривая только соседей в пределах определенной границы.Точка с наименьшим количеством соседей в пределах границы является самой сложной;и лучше всего его покрывает сосед с наиболее непокрытыми точками в пределах границ и т. д.

0 голосов
/ 09 февраля 2019

Поскольку у вас уже есть обе части, моим первым новым предложением будет разделить точки с помощью k-средних для k = n / 6400 (вы можете настроить этот параметр), а затем использовать целочисленное программирование для каждого суперкластера.Когда у меня будет возможность, я напишу другое предложение, которое включает в себя случайное смещение рассечения квадри.

Старый ответ перед редактированием вопроса ниже.


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

Идея состоит в том, чтобы начать с кластеров с 1 узлом, а затем использовать (почти) идеальные соответствия для объединения кластеров с каждымдругой, удваивая размер.Сделайте это 6 раз, чтобы получить кластеры по 64.

Чтобы вычислить соответствие, мы используем центр тяжести каждого кластера для его представления.Теперь нам просто нужно приблизительное сопоставление на множестве точек на евклидовой плоскости.С извинениями авторам многих прекрасных работ по евклидовому соответствию, вот эвристика O (n log n).Если есть два или меньше очков, сопоставьте их очевидным способом.В противном случае выберите случайную точку P и разбейте другие точки, сравнивая их (чередуя x- и y-) координату с P (как в kd-деревьях), разрывая связи, сравнивая другие координаты.Если возможно, назначьте P половине с нечетным количеством очков.(Если оба чётны, пусть P не имеет себе равных.) Рекурсивно сопоставлять половинки.

...