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

时间:2015-11-25 13:40:41

标签: python scikit-learn cluster-analysis dbscan

我一直在关注Geoff Boeing在DBSCAN上的优秀博客文章。我最感兴趣的页面是 -

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

如何修改此方法以返回最大群集的中心(群集中心,其中包含最多的纬度/经度点)?密度等级是否与每个群集的中心点相关?

核心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)

3 个答案:

答案 0 :(得分:1)

不幸的是,该博客文章在许多关键点上都是错误的。

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

  2. 明智地选择eps。在他的例子中,他选择eps这么小,他大多删除(接近)重复......

  3. DBSCAN群集没有有意义的中心。因为它们可能是非凸的。特别是,中心需要考虑到半径距离,他并不是这样。第一个版本使用均值,新版本使用最接近均值的点(但可能仍然会失真,因为平均值并没有考虑到地球)。

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

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

    original post以来,某些要点(特别是#4)得到了改善。 DBSCAN现在实际上使用了hasrsine和一个球树索引。

答案 1 :(得分:0)

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

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

.fa-soundcloud:hover:before

您可以采用每列的平均值

color: #2ea3f2;

如果您有兴趣在更强大的“中心”点进行估算,您还可以查看multivariate kernel density estimation函数。

答案 2 :(得分:0)

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

与另一位回应者相反,该博客帖子在许多方面并非错误:

  1. 单链接聚类 非常精细且在许多上下文中都很有用,包括博客文章作者使用的上下文。
  2. 他的eps 适当且适合他的用例,他解释明确意味着删除近似重复。
  3. 关于集群中心的博客文章并非错误 - 实际上它明确提到了非凸性,并且代码从集群返回一个点而不是集群的中心点本身。
  4. 博客文章中的代码在DBSCAN群集期间通过hasrsine指标使用大圆距离。
  5. 最重要的是,结果确切地说明了他们应该如何在博客文章中发布。