2014-06-05 167 views
2

我有一组要点。它们的几何(SRID:4326)存储在数据库中。 我已经给出了一个代码,旨在将这些点与DBSCAN进行聚类。参数设置如下:eps = 1000,min_points = 1。DBSCAN的参数eps,python

我获得的距离不到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

请勿使用“euclidean”。您的数据不在欧几里德向量空间中。在欧洲和美国的大部分地区,距离将被扭曲30%以上(而且北方更严重);而欧几里得距离不了解坐标系的-180°环绕。还要避免计算距离矩阵,这需要'O(n^2)'内存和运行时间。使用索引加速来快速找到邻居。 –

回答

2

这取决于您的实施

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

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

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

您可能需要使用ELKI的DBSCAN。根据他们的Java源代码,他们的距离函数使用仪表,而且他们的R * -tree索引允许加速范围查询与这个距离,这将产生加速()而不是O(n^2)