3

我有一套点。它们的几何形状(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 个样本大小的集群。

4

1 回答 1

3

这取决于您的实施

你的距离函数可以返回任何东西;包括米,毫米,码,公里,英里,度......但你没有分享你用于计算距离的函数!如果我没记错的话,SRID: 4326这并不意味着距离计算有任何意义。

sklearn"haversine"使用的似乎使用度数,而不是米。

无论哪种方式,min_points=1都是荒谬的。包含查询点,因此每个点本身都是一个集群。有了min_points <= 2,DBSCAN 的结果将是单链接聚类。要获得基于密度的聚类,您需要选择更高的值来获得真实密度。

您可能想使用ELKI的 DBSCAN。根据他们的 Java 资源,他们的距离函数使用米,而且他们的 R*-tree 索引允许使用这个距离进行加速范围查询,这将产生显着的加速(O(n log n)而不是O(n^2))。

于 2014-06-06T12:14:07.127 回答