【问题标题】:Using DBSCAN to find the most dense cluster?使用 DBSCAN 找到最密集的集群?
【发布时间】:2016-02-28 07:56:43
【问题描述】:

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

http://geoffboeing.com/2014/08/clustering-to-reduce-spatial-data-set-size/

如何修改这种方法以返回最大集群的中心(集群中心被最多的 lat/lng 点包围)?是否有与每个集群的中心点相关的密度等级?

核心 dbscan -

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)

【问题讨论】:

    标签: python scikit-learn cluster-analysis dbscan


    【解决方案1】:

    很遗憾,那篇博文在许多关键点上都是错误的。

    1. 从不将 DBSCAN 与 min_samples=1 一起使用。那就是单链接聚类。 如果您想要单链接,请使用单链接,而不是 DBSCAN。在这里,Leader 聚类可能也是一个不错的选择。

    2. 明智地选择eps。在他的示例中,他选择的 eps 非常小,他主要删除了(接近)重复项......

    3. DBSCAN 集群没有有意义的中心。因为它们可以是非凸的。特别是,中心需要考虑斜距,而他没有。第一个版本使用均值,新版本使用最接近均值的点(但仍可能失真,因为均值未考虑地球)。

    4. 在纬度、经度上,您应该已经在聚类期间使用大圆距离,而不仅仅是在之后。 (现已在博客中修复)。

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

    自从original post 以来,一些点(特别是#4)已经得到改进。 DBSCAN 现在实际上使用haversine 和球树索引。

    【讨论】:

    • 感谢您的建议 - 就数字 4 而言,这是否意味着我用大圆预筛选我的数据集以进行预聚类?有没有一种有效/标准的方法来做到这一点?
    • DBSCAN 可以简单地使用大圆距离,不需要做预处理。至少ELKI版本可以做到这一点,scikit-learn版本我不确定。
    【解决方案2】:

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

    找到分类点数最多的聚类:

    # 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
    

    如果您有兴趣估计更稳健的“中心”点,也可以查看 multivariate kernel density estimation 函数。

    【讨论】:

    • 哎哟。 k-均值,k=1?从未听说过“平均”功能?!?
    【解决方案3】:

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

    与另一位回复者相反,该博文并没有在很多方面有误:

    1. 单链接聚类在许多情况下都非常好用,包括博文作者正在使用的情况。
    2. 他的 eps 适合并为他的用例正确选择,他解释说这明确意味着删除近乎重复的内容。
    3. 关于集群中心的博文没有错误 - 事实上,它明确提到了非凸性,并且代码从集群返回一个点,而不是集群的中心点本身。
    4. 博文中的代码确实在 DBSCAN 聚类期间通过haversine 度量使用大圆距离。

    最重要的是,结果完全符合博客文章中的预期。

    【讨论】:

    • 如果你想要单链聚类,使用单链会更高效。那是用大锤敲碎坚果。这是可能的,但并不明智。
    • 另请注意,他已经更改了帖子和代码,并开始解决其中一些问题:github.com/gboeing/2014-summer-travels/issues/1
    猜你喜欢
    • 2016-06-22
    • 2018-10-11
    • 2020-04-08
    • 2020-08-27
    • 2016-02-03
    • 2017-02-08
    • 2023-03-23
    • 2013-09-04
    • 2019-09-19
    相关资源
    最近更新 更多