在 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 中找到每个集群中出现最多的位置的主要内容,如果未能解决你的问题,请参考以下文章
Js对象(五)如何查找字符串中出现次数最多的字符 2021-11-24