Алгоритм пространственной кластеризации - PullRequest
2 голосов
/ 07 марта 2019

Учитывая набор точек на 2D-плоскости, я хочу найти наборы X точек, которые находятся в пределах Y друг от друга. Например:

8|
7|    a     b
6|
5|       c
4|
3|                    e
2|                  d          
1|
-------------------------
  1 2 3 4 5 6 7 8 9 0 1

a, b, c и d - это точки на 2D-плоскости. При заданных аргументах 3 для количества точек (X) и 3 для расстояния (Y) алгоритм вернет [[a, b, c]]. Некоторые примеры:

algorithm(X = 3, Y = 3) returns [[a, b, c]]
algorithm(X = 2, Y = 3) returns [[a, b, c], [d, e]] -- [a, b, c] contains at least two points
algorithm(X = 4, Y = 3) returns [] -- no group of 4 points close enough
algorithm(X = 5, Y = 15) returns [[a, b, c, d, e]]

Ограничения:

  • оси x и y (цифры выше) имеют длину 10000 единиц
  • На графике 800 точек (a, b, c, d и т. Д.)
  • Не думаю, что это имеет значение, но я использую JavaScript

Вещи, которые я пробовал:

  • Я на самом деле беспокоюсь о выводе новых точек, которые близки к нескольким входным точкам, поэтому я попытался перебрать сетку и «оглядеть» ее, используя Пифагора, чтобы найти каждую точку на заданном расстоянии. Это слишком медленно, учитывая общую площадь. См. Источник здесь . Вы также можете увидеть размер данных в тесте реальных данных .
  • DBSCAN , что, кажется, имеет другую цель - я знаю, насколько большим я хочу, чтобы размер моего кластера был.
  • Я в настоящее время пытаюсь сравнивать точки друг с другом и строить близкие пары, затем закрывать триплеты и т. Д. До конца, но, похоже, это тоже ведет к неэффективной дыре , Я собираюсь продолжить и попробовать что-то вроде хеширования или словаря, чтобы избежать этих циклов.

1 Ответ

1 голос
/ 07 марта 2019

Имея всего 800 точек, вы, вероятно, можете просто построить график, сравнивая каждую пару, а затем запустить Брон - Кербош , чтобы найти максимальные клики. Вот легитимная реализация этого алгоритма на Javascript: https://github.com/SeregPie/almete.BronKerbosch

...