使用自定义距离度量对纬度/长度对进行聚类

时间:2014-05-02 04:11:37

标签: cluster-analysis scikit-learn dbscan

我试图为scikit-learn DBSCAN实现指定自定义群集功能:

def geodistance(latLngA, latLngB):
    print latLngA, latLngB
    return vincenty(latLngA, latLngB).miles

cluster_labels = DBSCAN(
            eps=500,
            min_samples=max(2, len(found_geopoints)/10),
            metric=geodistance
).fit(np.array(found_geopoints)).labels_

但是,当我打印出距离函数的参数时,它们根本不是我所期望的:

[ 0.53084126  0.19584111  0.99640966  0.88013373  0.33753788  0.79983037
  0.71716144  0.85832664  0.63559538  0.23032912]
[ 0.53084126  0.19584111  0.99640966  0.88013373  0.33753788  0.79983037
  0.71716144  0.85832664  0.63559538  0.23032912]

这就是我的found_geopoints数组的样子:

[[  4.24680600e+01   1.40868060e+02]
 [ -2.97677600e+01  -6.20477000e+01]
 [  3.97550400e+01   2.90069000e+00]
 [  4.21144200e+01   1.43442500e+01]
 [  8.56111000e+00   1.24771390e+02]
...

那么为什么不是距离函数纬度经度对的参数?

2 个答案:

答案 0 :(得分:3)

我似乎找到了一个可以使用以下方法计算距离矩阵的工作: http://scikit-learn.org/stable/modules/generated/sklearn.metrics.pairwise.pairwise_distances.html 然后将其用作DBSCAN(metric='precomputed').fit(distance_matrix)

的参数

答案 1 :(得分:1)

您可以使用scikit-learn执行此操作:将hasrsine指标与球树算法一起使用,并将弧度单位传递到DBSCAN拟合方法中。

本教程演示了如何 cluster spatial lat-long data with scikit-learn's DBSCAN 使用基于长度点之间准确的大地距离的群集指标进行聚类:

df = pd.read_csv('gps.csv')
coords = df.as_matrix(columns=['lat', 'lon'])
db = DBSCAN(eps=eps, min_samples=ms, algorithm='ball_tree', metric='haversine').fit(np.radians(coords))

请注意,坐标以弧度单位的形式传递给.fit()方法,并且epsilon参数值也必须以弧度为单位。

如果你想要epsilon,比如1.5km,那么以弧度为单位的epsilon参数值将= 1.5 / 6371。