Python 使用DBSCAN查找最密集的群集?

Python 使用DBSCAN查找最密集的群集?,python,scikit-learn,cluster-analysis,dbscan,Python,Scikit Learn,Cluster Analysis,Dbscan,我一直在看Geoff Boeing在DBSCAN上的精彩博客文章。我最感兴趣的页面是- 我如何修改此方法以返回最大群集的中心(群集中心周围有最多lat/lng点)?是否存在与每个簇的中心点相关的密度等级 核心DBS可以- db = DBSCAN(eps=.01, min_samples=1).fit(coordinates) labels = db.labels_ num_clusters = len(set(labels)) - (1 if -1 in labels else 0) clus

我一直在看Geoff Boeing在DBSCAN上的精彩博客文章。我最感兴趣的页面是-

我如何修改此方法以返回最大群集的中心(群集中心周围有最多lat/lng点)?是否存在与每个簇的中心点相关的密度等级

核心DBS可以-

db = DBSCAN(eps=.01, min_samples=1).fit(coordinates)
labels = db.labels_
num_clusters = len(set(labels)) - (1 if -1 in labels else 0)
clusters = pd.Series([coordinates[labels == i] for i in xrange(num_clusters)])
print('Number of clusters: %d' % num_clusters)

不幸的是,这篇博文在一些关键点上是错误的

  • 切勿将DBSCAN与
    minu samples=1
    一起使用。即单连锁聚类如果需要单链接,请使用单链接,而不是DBSCAN。在这里,领导者集群可能也是一个不错的选择

  • 明智地选择eps。在他的例子中,他选择了非常小的eps,他几乎删除了(接近)重复的eps

  • DBSCAN群集没有有意义的中心。因为它们可以是非凸的。特别是,中心需要考虑哈弗斯距离,而他没有。第一个版本使用的是平均值,新版本使用的是最接近平均值的点(但由于平均值没有考虑地球,所以可能仍然会被扭曲)

  • 在纬度和经度上,您应该在聚类过程中使用大圆距离,而不仅仅是之后。(现在已在博客中修复)

  • 上面的第3点也回答了您的问题:DBSCAN群集可能没有有意义的中心。中心可以位于群集外部


    自改革以来,一些要点(特别是第4点)得到了改进。DBSCAN现在实际上使用了haversine和ball树索引。

    如果您有兴趣将最大的簇表示为“中心”点(例如,降维),我将执行以下操作:

    查找分类点数最多的群集:

    # Assumes coordinates is a DataFrame
    db = DBSCAN(eps=eps, min_samples=min_samples).fit(coordinates)
    df = pd.DataFrame([coordinates.x, coordinates.y, db.labels_]).T # Add other attributes of coordinates if needed
    df.columns = ['x', 'y','label']; # Add column names
    max_label = df.label.mode()[0];
    
    max_cluster = df[df['label']==max_label];
    
    可以取每列的平均值

    max_cluster_array = max_cluster[['x','y']].as_matrix()
    print max_cluster_array.mean(axis=0) # what you are looking for
    

    如果你有兴趣评估一个更强大的“中心”点,你也可以研究函数。

    我也在做一个类似的项目,并使用他的博客文章作为指导。返回最大集群中心的逻辑(但请注意,使用DBSCAN时,中心本身可能没有意义):按大小对集群排序,取最大值,计算质心(使用该博客文章中提供的逻辑)。那你就有选择了。您可以将计算出的质心保留为“中心点”,也可以在集群中找到离该质心最近的点(正如该博客文章的作者所做的)

    与另一位回复者相反,该博客帖子在以下几点上没有错误:

  • 单链接集群非常好,在许多环境中都很有用,包括博客作者正在使用的环境
  • 他的eps对于他的用例来说是合适的,并且是正确的选择,他解释说,这个用例明确地意味着要删除几乎重复的内容
  • 关于集群中心的博客文章没有错——事实上,它明确提到了非凸性,代码从集群返回一个点,而不是集群的中心点本身
  • 博客文章中的代码确实在DBSCAN聚类过程中通过haversine度量使用了大圆距离

  • 最重要的是,结果与他们在博客文章中的预期完全一致。

    Ouch。k=1的k-均值?从没听说过“平均”功能?!?感谢您的建议-就第4条而言,这是否意味着我将使用great circle预筛选数据集以进行预聚类?有没有一种有效/标准的方法可以做到这一点?DBSCAN可以简单地使用大圆距离,而不需要进行预处理。至少ELKI版本可以做到这一点,我不确定scikit学习版本。如果你想要单链接集群,使用单链接更有效。那是用大锤敲螺母。这是可能的,但不明智。还要注意的是,他已经改变了帖子和代码,并开始解决其中一些问题: