【问题标题】:Clustering longitude and latitude gps data聚类经纬度 gps 数据
【发布时间】:2016-08-17 09:33:56
【问题描述】:

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

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

我需要对点之间的距离 我尝试使用DBSCAN,但它似乎不适用于geo(longitude, latitude)

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

【问题讨论】:

  • 请显示您目前尝试过的代码:minimal reproducible example
  • DBSCAN 适用于纬度、经度 - 只需选择适当的距离函数(并确保您知道它是否使用米、码……)

标签: python scikit-learn cluster-analysis


【解决方案1】:

您可以使用 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)

希望这会有所帮助。

耿宇

【讨论】:

    【解决方案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距离并且非常快。

    【讨论】:

      猜你喜欢
      • 2019-08-03
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多