在 DBSCAN 中找到每个集群中出现最多的位置

Posted

技术标签:

【中文标题】在 DBSCAN 中找到每个集群中出现最多的位置【英文标题】:Find the location that occurs most in every cluster in DBSCAN 【发布时间】:2017-02-08 10:14:04 【问题描述】:

玩转这个 DBSCAN 示例: http://geoffboeing.com/2014/08/clustering-to-reduce-spatial-data-set-size/

作者对每个集群使用最中心点。但是,我想使用每个集群中出现次数最多的位置的坐标来表示该集群。在我的数据集中,DBSCAN 工作得很好,但我想将这些集群聚集在一起,可能在生成的较小数据集上使用层次聚类。关于如何找到出现次数最多的位置的任何指导都会很棒。欢迎任何其他改进集群的建议!谢谢!

Data == 类似于参考博客中的位置历史记录的数据框

eps_rad = 32 / 6371.0088 #convert to radians
coords = data.as_matrix(columns=['LocLatDegrees', 'LocLongDegrees'])    
db = DBSCAN(eps=eps_rad, min_samples=50, algorithm='ball_tree', metric='haversine').fit(np.radians(coords))
cluster_labels = db.labels_
num_clusters = len(set(cluster_labels))  
n_clusters = len(set(cluster_labels)) - (1 if -1 in cluster_labels else 0)
print('Number of clusters: :,'.format(n_clusters))
#remove the noise i.e. cluster label -1
data =data[cluster_labels!=-1]
coords =coords[cluster_labels!=-1]
cluster_labels =cluster_labels[cluster_labels!=-1]
clusters = pd.Series([coords[cluster_labels==n] for n in range(n_clusters)])

【问题讨论】:

【参考方案1】:

那篇博文不是特别好。

通过设置 min_samples=1,他并没有真正使用 DBSCAN(因为这会禁用 密度)。相反,他获得了单链接层次聚类结果(树状图在高度ε处“切割”)。

因为 DBSCAN 允许任意形状的簇,所以中心和最中心点实际上可能是一个不好的选择。而且他的代码在确定中心时假设地球是平的...所以该博客文章的这一部分也不是很合理...

如果你考虑这个image from Wikipedia

那么你可以看到,红色簇的最中心点可能不是一个好的选择。

如果你只是想减少你的数据集大小,我建议你使用非常简单的Leader聚类方法。

J。 A.哈蒂根。聚类算法。约翰威利父子公司,纽约,1975 年

这更接近于减少数据集大小的目标:本质上你定义了一个阈值 d,如果你已经有一个比 d 更近的对象,你就跳过点,否则就保留它。与 DBSCAN 相比,这不会产生类似香蕉的簇。

但如果你打算事后进行层次聚类,那为什么要先使用这个近似值呢?

正如在另一个 *** 问题中指出的那样,请注意 scipy.cluster.hierarchy.leaders 不是领导算法。有一个名为leaderCluster 的R 包,以及我最近关注的用于集群的ELKI 项目added Leader to Github。由于ELKI版本可以使用索引,我希望它会快很多,但是我没有尝试过(他们的DBSCAN和OPTICS真的很快,所以我通常将ELKI用于大型数据集;我喜欢覆盖树索引,它不需要比距离函数更多的参数,而且效果很好——发现它比 R*-tree 更快、更容易使用;但这些是我个人的偏好——我希望 jupyter 能添加一些 Java 支持)。

【讨论】:

我同意你的看法。我正在使用 minPts = 50。我有 350k 数据点,并且 DBSCAN 工作正常,将其减少到 225 个集群。但是,我希望将这些集群中的一些合并在一起——我想我可以通过在集群中心周围画圈来做到这一点。正如问题中提到的,我不想使用最中心点。我正在考虑在每个集群中使用最常出现的位置。将在 leaderCluster 进行尝试。

以上是关于在 DBSCAN 中找到每个集群中出现最多的位置的主要内容,如果未能解决你的问题,请参考以下文章

在 scikit DBSCAN 中查找每个集群内的元素?

Js对象(五)如何查找字符串中出现次数最多的字符 2021-11-24

使用python分离DBSCAN中每个集群的坐标(3D坐标)

获取在一个数组中出现最多的字符及其所在的位置

从数组中找到元素出现次数最多的元素

只用2GB内存在20亿个整数中找到出现次数最多的数