使用自定义距离度量来对经纬度对进行聚类
我正试图为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]
...
那么为什么不是距离函数纬度经度对的参数呢?
我似乎已经找到了使用以下方法计算距离矩阵的工作:http://scikit-learn.org/stable/modules/generated/sklearn.metrics.pairwise.pairwise_distances.html然后将其用作DBSCAN(metric='precomputed').fit(distance_matrix)
的参数DBSCAN(metric='precomputed').fit(distance_matrix)
你可以通过scikit-learn来做到这一点:在球树算法中使用haversine度量,并将弧度单位传递给DBSCAN拟合方法。
本教程演示了如何使用scsiit-learn的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。
链接地址: http://www.djcxy.com/p/20205.html上一篇: Clustering using a custom distance metric for lat/long pairs