DBSCAN для построения кластеров координатных данных

У меня есть массив координатных данных (в Web Mercator Eastings и Northings, то есть в метрах), который выглядит так:

array([[ -232372.201264,  6785082.61011 ],
   [ -233396.451899,  6784865.49884 ],
   [ -234045.110572,  6784642.2575  ],
   ..., 
   [ -234473.356653,  6778646.81953 ],
   [ -234918.300657,  6778772.69366 ],
   [ -230900.668915,  6778369.2902  ]])

Этот массив хранится как переменная 'coords'.

Я пытаюсь вычислить, а затем построить кластеры в этом наборе данных, используя Scikit Learn и DBSCAN (спасибо этот пост за то, что зашли так далеко).

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

db = DBSCAN(eps=0.2, min_samples=1, metric="precomputed")
cluster_labels = db.labels_
num_clusters = len(set(cluster_labels))
clusters = pd.Series([coords[cluster_labels == n] for n in range(num_clusters)])
print('Number of clusters: {}'.format(num_clusters))

...

AttributeError: 'DBSCAN' object has no attribute 'labels_'

Кто-нибудь может объяснить, где я ошибаюсь?


person the_bonze    schedule 25.04.2017    source источник
comment
какую версию sklearn вы используете?   -  person Grr    schedule 25.04.2017
comment
@Grr Я использую v0.18.1   -  person the_bonze    schedule 25.04.2017
comment
Web Mercator не в метрах, а в пикселях при заданном уровне масштабирования? Кроме того, он не работает на линии 180 градусов... и вы получаете существенную ошибку из-за искажения.   -  person Has QUIT--Anony-Mousse    schedule 25.04.2017
comment
Выберите два города друг от друга с востока на запад, например, Нью-Йорк и Сан-Франциско, и проверьте расстояние до них!   -  person Has QUIT--Anony-Mousse    schedule 25.04.2017
comment
@Anony-Mousse Восток и Север, о которых я говорил, имеют значения в метрах: epsg.io/3857   -  person the_bonze    schedule 27.04.2017
comment
Итак, кажется, уровень масштабирования соответствует экватору. Вы пробовали расстояние, которое я упомянул, чтобы понять, насколько велики ваши ошибки? Я бы предпочел не полагаться на восток, если не близко к экватору. Потому что я предполагаю, что вы получаете расстояние примерно в 1,4 раза больше, чем фактическое расстояние, и это довольно существенная ошибка. Проекции Меркатора непригодны для расстояний.   -  person Has QUIT--Anony-Mousse    schedule 27.04.2017


Ответы (2)


вам не хватает fit:

db = DBSCAN(eps=0.2, min_samples=1, metric="precomputed")
db.fit(data)
cluster_labels = db.labels_
num_clusters = len(set(cluster_labels))
clusters = pd.Series([coords[cluster_labels == n] for n in range(num_clusters)])
print('Number of clusters: {}'.format(num_clusters))
person Abhishek Thakur    schedule 25.04.2017
comment
Спасибо! Однако теперь я получаю новую ошибку: ValueError: Предварительно вычисленная метрика требует формы (n_queries, n_indexed). Получил (10487, 2) для 10487 проиндексированных. - person the_bonze; 25.04.2017
comment
удалить metric="precomputed" - person Abhishek Thakur; 25.04.2017
comment
Вроде работает - спасибо! Как удаление предвычислений влияет на результат? Извинения за вопросы n00b; это все новое для меня. Спасибо за помощь :) - person the_bonze; 25.04.2017
comment
Из документов: если метрика «предварительно вычислена», предполагается, что X является матрицей расстояний и должен быть квадратным. X может быть разреженной матрицей, и в этом случае только «ненулевые» элементы могут считаться соседями для DBSCAN. - person Abhishek Thakur; 25.04.2017

Вы должны называть это как

db=DBSCAN(eps=0.2, min_samples=1, metric="precomputed").fit(mymatrix) 

(обратите внимание на функцию fit())

person Leo Martins    schedule 25.04.2017