Предполагая, что количество и «истинное» местоположение сайтов неизвестно, вы можете попробовать алгоритм кластеризации 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. ]]