【发布时间】:2014-06-18 16:38:13
【问题描述】:
我正在尝试为 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]
...
那么为什么距离函数的参数不是纬度经度对呢?
【问题讨论】:
-
vincenty是做什么的?你为什么看len(found_geopoints)? -
形成集群的最小样本数取决于可用的地理点数。 vincenty 是en.wikipedia.org/wiki/Vincenty's_formulae 的实现
-
我是否得出结论
latLngA和latLngB是相同的 - 都是 10 个元素长?您对 DBSCAN 了解多少?found_geopoints的总大小是多少?你在哪些单位工作?度数? -
latLngA 和 latLngB 是相同的。 len(found_geopoints) == 83。我的工作是度数。几天前我第一次读到 DBSCAN。
-
ELKI(不是 python,而是 Java)内置了对大地距离的支持,以及全索引加速(使用 R*-trees)。这将在
O(n log n)而不是O(n^2)中运行。
标签: cluster-analysis scikit-learn dbscan