【发布时间】:2016-04-07 08:39:54
【问题描述】:
我有一个包含纬度和经度对的数据框。
这是我的数据框的样子。
order_lat order_long
0 19.111841 72.910729
1 19.111342 72.908387
2 19.111342 72.908387
3 19.137815 72.914085
4 19.119677 72.905081
5 19.119677 72.905081
6 19.119677 72.905081
7 19.120217 72.907121
8 19.120217 72.907121
9 19.119677 72.905081
10 19.119677 72.905081
11 19.119677 72.905081
12 19.111860 72.911346
13 19.111860 72.911346
14 19.119677 72.905081
15 19.119677 72.905081
16 19.119677 72.905081
17 19.137815 72.914085
18 19.115380 72.909144
19 19.115380 72.909144
20 19.116168 72.909573
21 19.119677 72.905081
22 19.137815 72.914085
23 19.137815 72.914085
24 19.112955 72.910102
25 19.112955 72.910102
26 19.112955 72.910102
27 19.119677 72.905081
28 19.119677 72.905081
29 19.115380 72.909144
30 19.119677 72.905081
31 19.119677 72.905081
32 19.119677 72.905081
33 19.119677 72.905081
34 19.119677 72.905081
35 19.111860 72.911346
36 19.111841 72.910729
37 19.131674 72.918510
38 19.119677 72.905081
39 19.111860 72.911346
40 19.111860 72.911346
41 19.111841 72.910729
42 19.111841 72.910729
43 19.111841 72.910729
44 19.115380 72.909144
45 19.116625 72.909185
46 19.115671 72.908985
47 19.119677 72.905081
48 19.119677 72.905081
49 19.119677 72.905081
50 19.116183 72.909646
51 19.113827 72.893833
52 19.119677 72.905081
53 19.114100 72.894985
54 19.107491 72.901760
55 19.119677 72.905081
我想聚集这些彼此最近的点(200米距离),下面是我的距离矩阵。
from scipy.spatial.distance import pdist, squareform
distance_matrix = squareform(pdist(X, (lambda u,v: haversine(u,v))))
array([[ 0. , 0.2522482 , 0.2522482 , ..., 1.67313071,
1.05925366, 1.05420922],
[ 0.2522482 , 0. , 0. , ..., 1.44111548,
0.81742536, 0.98978355],
[ 0.2522482 , 0. , 0. , ..., 1.44111548,
0.81742536, 0.98978355],
...,
[ 1.67313071, 1.44111548, 1.44111548, ..., 0. ,
1.02310118, 1.22871515],
[ 1.05925366, 0.81742536, 0.81742536, ..., 1.02310118,
0. , 1.39923529],
[ 1.05420922, 0.98978355, 0.98978355, ..., 1.22871515,
1.39923529, 0. ]])
然后我在距离矩阵上应用 DBSCAN 聚类算法。
from sklearn.cluster import DBSCAN
db = DBSCAN(eps=2,min_samples=5)
y_db = db.fit_predict(distance_matrix)
我不知道如何选择 eps 和 min_samples 值。它将太远的点聚集在一个簇中。(距离约2公里)是因为它在聚类时计算欧几里得距离吗?请帮忙。
【问题讨论】:
-
请注意,DBSCAN 不会限制集群中的成对距离。它可传递地加入组半径epsilon,这意味着最大距离没有有用的上限(eps+eps+eps+eps+eps+...每次加入都会将最大值增加eps,所以最大距离为 (numCorePointsInCluster+1)*epsilon)。允许这种情况发生是算法的设计意图。
-
@Anony-Mousse 是否可以使用可用的 DBSCAN 选项将
cluster size限制为最大值? -
没有。当所有东西都连接起来时,根据定义,所有东西都是一个集群。它应该是,根据集群的概念:相似的东西应该在同一个集群中,不管有多少。如果您对控制集群的大小更感兴趣,您可能更喜欢量化方法。
-
您好,谢谢您的提问,我也很想知道 epsilon 的单位是什么?比如eps=2,是不是代表2km?还是200m?
标签: python cluster-analysis dbscan