Групповые GPS точки с пандами - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть данные о башнях Pandas, например:

site       lat      lon
18ALOP01   11.1278  14.3578
18ALOP02   11.1278  14.3578
18ALOP12   11.1288  14.3575
18PENO01   11.1580  14.2898

И мне нужно сгруппировать их, если они находятся слишком близко (50 м).Затем я создал скрипт, который выполняет «самоперекрестное соединение», вычисляет расстояние между комбинациями всех сайтов и задает один и тот же идентификатор для тех, где расстояние меньше порогового значения.Итак, если у меня есть n сайтов, он будет рассчитывать (n^2) - n комбинаций, то это плохой алгоритм.Есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 24 ноября 2018

Предполагая, что количество и «истинное» местоположение сайтов неизвестно, вы можете попробовать алгоритм кластеризации MeanShift .Хотя это универсальный алгоритм и он плохо масштабируется, он будет быстрее, чем реализация вашего собственного алгоритма кластеризации в python, и вы можете поэкспериментировать с bin_seeding=True в качестве оптимизации, если объединение точек данных в сеткуприемлемый короткий путь, чтобы обрезать стартовые семена.(Примечание: если объединение точек данных в сетку, а не вычисление евклидова расстояния между точками, является приемлемым «полным» решением, похоже, это будет самый быстрый подход к вашей проблеме.)

Вот примерРеализация MeanShift в scikit-learn, где координаты x / y указаны в метрах, а алгоритм создает кластеры с радиусом 50 м.

In [2]: from sklearn.cluster import MeanShift

In [3]: import numpy as np

In [4]: X = np.array([
   ...:     [0, 1], [51, 1], [100, 1], [151, 1],
   ...: ])

In [5]: clustering = MeanShift(bandwidth=50).fit(X)  # OR speed up with bin_seeding=True

In [6]: print(clustering.labels_)
[1 0 0 2]

In [7]: print(clustering.cluster_centers_)
[[ 75.5   1. ]
 [  0.    1. ]
 [151.    1. ]]
...