我一直在关注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)
答案 0 :(得分:1)
不幸的是,该博客文章在许多关键点上都是错误的。
从不将DBSCAN与min_samples=1
一起使用。那就是单链接聚类。 如果您想要单链接,请使用单链接,而不是DBSCAN 。在这里,Leader聚类也是一个不错的选择。
明智地选择eps
。在他的例子中,他选择eps这么小,他大多删除(接近)重复......
DBSCAN群集没有有意义的中心。因为它们可能是非凸的。特别是,中心需要考虑到半径距离,他并不是这样。第一个版本使用均值,新版本使用最接近均值的点(但可能仍然会失真,因为平均值并没有考虑到地球)。
在纬度,经度上,您应该在群集期间使用大圆距离,而不仅仅是之后。 (现在已在博客中修复)。
上面的第3点也回答了您的问题:DBSCAN群集可能没有有意义的中心。中心可以在群集之外。
自original post以来,某些要点(特别是#4)得到了改善。 DBSCAN现在实际上使用了hasrsine和一个球树索引。
答案 1 :(得分:0)
如果您有兴趣将最大的集群表示为“中心”点(例如,减少维数),我会执行以下操作:
找到分类点数最多的群集:
.fa-soundcloud:hover:before
您可以采用每列的平均值
color: #2ea3f2;
如果您有兴趣在更强大的“中心”点进行估算,您还可以查看multivariate kernel density estimation函数。
答案 2 :(得分:0)
我也正在开展一个类似的项目,并将他的博客文章作为指南。返回最大集群中心的逻辑(但要注意,中心本身对于DBSCAN可能毫无意义):按大小对集群进行排序,取最大值,计算质心(使用该博客文章中提供的逻辑)。然后你有一个选择。您可以将计算出的质心保持为“中心点”,也可以在距离该质心最近的群集中找到该点(正如该博客文章的作者所做的那样)。
与另一位回应者相反,该博客帖子在许多方面并非错误:
最重要的是,结果确切地说明了他们应该如何在博客文章中发布。