我有超过40万辆汽车GPS位置,例如:
[ 25.41452217, 37.94879532],
[ 25.33231735, 37.93455887],
[ 25.44327736, 37.96868896],
...
我需要使用点之间的距离进行空间聚类 <= 3 米。
我尝试使用DBSCAN
,但似乎它对geo(longitude, latitude)
不起作用。
另外,我不知道集群的数量。
您可以使用pairwise_distances来计算与纬度/经度的地理距离,然后通过指定metric='precomputed'将距离矩阵传递到DBSCAN中。
要计算距离矩阵:
from sklearn.metrics.pairwise import pairwise_distances
from sklearn.cluster import DBSCAN
from geopy.distance import vincenty
def distance_in_meters(x, y):
return vincenty((x[0], x[1]), (y[0], y[1])).m
distance_matrix = pairwise_distances(sample, metric=distance_in_meters)
要使用矩阵运行 DBSCAN,请执行以下操作:
dbscan = DBSCAN(metric='precomputed', eps=3, min_samples=10)
dbscan.fit(distance_matrix)
希望这有帮助。
耿宇
DBSCAN是一个合理的选择,但使用分层聚类算法(如OPTICS和HDBSCAN*)可以获得更好的结果。
前段时间我写了一篇关于聚类 2300 万个推文位置的博客文章:
http://www.vitavonni.de/blog/201410/2014102301-clustering-23-mio-tweet-locations.html
这里也是一个用于聚类 GPS 点的博客。她使用了一种非常相似的方法,并提供了更多细节:
https://doublebyteblog.wordpress.com/
从本质上讲,OPTICS 适用于此类数据,并且您确实需要使用 ELKI 中的 R* 树或覆盖树等索引。两者都使用Haversine距离并且非常快。