我有超过40万辆汽车GPS位置,如:
[ 25.41452217, 37.94879532],
[ 25.33231735, 37.93455887],
[ 25.44327736, 37.96868896],
...
我需要进行空间聚类,点之间的距离<= 3米
我尝试使用DBSCAN
,但它似乎不适用于geo(longitude, latitude)
。
另外,我不知道群集的数量。
答案 0 :(得分:4)
您可以使用pairwise_distances计算纬度/经度的Geo距离,然后通过指定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)
希望这有帮助。
Gengyu
答案 1 :(得分:2)
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 * -tree或Cover树。两者都与Haversine距离一起工作并且非常快。