参数eps的DBSCAN,python

时间:2014-06-05 21:23:49

标签: python cluster-analysis data-mining scikit-learn dbscan

我有一套积分。它们的几何(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个样本的簇。

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))。