聚类经度和纬度gps数据

时间:2016-04-23 20:33:18

标签: python scikit-learn cluster-analysis

我有超过40万辆汽车GPS位置,如:

[ 25.41452217,  37.94879532],
[ 25.33231735,  37.93455887],
[ 25.44327736,  37.96868896],
... 

我需要进行空间聚类,点之间的距离<= 3米 我尝试使用DBSCAN,但它似乎不适用于geo(longitude, latitude)

另外,我不知道群集的数量。

2 个答案:

答案 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距离一起工作并且非常快。