我有一套积分。它们的几何(SRID:4326)存储在数据库中。 我已经获得了一个代码,旨在通过DBSCAN聚集这一点。参数设置如下:eps = 1000,min_points = 1。
我获得的距离不到1000米。我相信距离不到1000米的两个点将属于同一个集群。 epsilon真的是米吗?
代码如下:
self.algorithm='DBSCAN'
X=self.data[:,[2,3]]
if self.debug==True:
print 'Nbr of Points: %d'% len(X)
# print X.shape
# print dist_matrix.shape
D = distance.squareform(distance.pdist(X,'euclidean'))
# print dist_matrix
# S = 1 - (D / np.max(D))
db = DBSCAN(eps, min_samples).fit(D)
self.core_samples = db.core_sample_indices_
self.labels = db.labels
目的不是找到另一种方式来运行它,而是真正了解eps的价值。它在距离方面的代表性。 Min_sample设置为1,因为我接受确实拥有大小为1个样本的簇。
答案 0 :(得分:3)
这取决于您的实施。
距离函数可以返回任何内容;包括米,毫米,码,公里,英里,度......但你没有分享你用来计算距离的功能!
如果我没有弄错的话,SRID: 4326
并不意味着任何关于距离计算的事情。
sklearn使用的"haversine"
似乎使用度,而不是米。
无论哪种方式,min_points=1
都是荒谬的。包含查询点,因此每个点本身都是一个集群。使用min_points <= 2
,DBSCAN的结果将是单链接聚类。要获得基于密度的聚类,您需要选择更高的值来获得真实密度。
您可能想要使用ELKI的DBSCAN。根据他们的Java源代码,他们的距离函数使用米,但他们的R * -tree索引允许使用此距离进行加速范围查询,这将产生实质加速(O(n log n)
而不是O(n^2)
)。