DBSCAN 按位置和密度对数据进行聚类

Posted

技术标签:

【中文标题】DBSCAN 按位置和密度对数据进行聚类【英文标题】:DBSCAN for clustering data by location and density 【发布时间】:2016-05-01 17:24:56 【问题描述】:

我正在使用 dbscan::dbscan 方法按位置和密度对数据进行聚类。

我的数据如下所示:

str(data)
'data.frame': 4872 obs. of 3 variables:
 $ price    : num ...
 $ lat      : num ...
 $ lng      : num ...

现在我正在使用以下代码:

EPS = 7
cluster.dbscan <- dbscan(data, eps = EPS, minPts = 30, borderPoints = T, 
search = "kdtree")
plot(lat ~ lng, data = data, col = cluster.dbscan$cluster + 1L, pch = 20)

但结果一点也不令人满意,点并没有真正聚集。

我想很好地定义集群,如下所示:

我还尝试使用效果更好的决策树分类器tree:tree,但我无法判断它是否真的是一个好的分类。

文件:

http://www.file-upload.net/download-11246655/file.csv.html

问题:

有没有可能实现我想要的? 我是否使用了正确的方法? 我应该更多地使用参数吗?如果是,与哪个?

【问题讨论】:

如果可能,您应该提供数据集,或者玩具数据集。 @lukeA 我刚刚添加了数据集。 我不认为文件中的数据代表你的数据集。请看一看。 @lukeA:是的,你是对的。我错误地添加了两次lng 列。我更新了文件。我不知道为什么会出现额外的列X 谢谢。没有使用价格属性?好吧,如果您想按位置和密度进行集群,dbscan 将是一个不错的选择。它将密集的部分组合在一起,例如plot(lat ~ lng, data = data, col = dbscan(data[, c("lat", "lng")], eps = 0.004, minPts = 3)$cluster + 1L, pch = 20)。但是,您的椭圆表明您希望将密集和非密集部分聚集在一起。我不明白这是怎么回事。决策树适用于监督分类任务,但您的数据没有标记。也许有人有一个想法。否则我也会在stats.stackexchange.com 上试试运气。 【参考方案1】:

这是使用全新 HDBSCAN* 算法仔细基于密度的聚类的输出。

使用Haversine距离,而不是欧几里得!

它确定了一些 50 多岁的区域,这些区域比周围环境密集得多。在这个图中,一些簇看起来好像只有 3 个元素,但它们确实有更多。

最外面的区域,这些是噪声点,根本不属于任何聚类!

(使用的参数:-verbose -dbc.in file.csv -parser.labelIndices 0,1 -algorithm clustering.hierarchical.extraction.HDBSCANHierarchyExtraction -algorithm SLINKHDBSCANLinearMemory -algorithm.distancefunction geo.LatLngDistanceFunction -hdbscan.minPts 20 -hdbscan.minclsize 20

OPTICS 是另一种基于密度的算法,结果如下:

同样,我们有一个“噪音”区域,其中的红点根本不密集

使用的参数:-verbose -dbc.in file.csv -parser.labelIndices 0,1 -algorithm clustering.optics.OPTICSXi -opticsxi.xi 0.1 -algorithm.distancefunction geo.LatLngDistanceFunction -optics.minpts 25

此数据集的 OPTICS 图如下所示:

可以看到有很多小山谷对应着簇。但这里没有“大”结构。

您可能正在寻找这样的结果:

但事实上,这是一种毫无意义,而是随机将数据分成大块的方式。当然,它最大限度地减少了差异。但它根本不关心数据的结构一个簇中的点通常比不同簇中的点具有更少的共同点。只需查看红色、橙色和紫色簇之间边界处的点。

最后但并非最不重要的一点是,oldtimers:具有完整链接的层次聚类:

和树状图:

(使用的参数:-verbose -dbc.in file.csv -parser.labelIndices 0,1 -algorithm clustering.hierarchical.extraction.SimplifiedHierarchyExtraction -algorithm AnderbergHierarchicalClustering -algorithm.distancefunction geo.LatLngDistanceFunction -hierarchical.linkage CompleteLinkageMethod -hdbscan.minclsize 50

还不错。完整的链接也可以很好地处理此类数据。但是您可以合并或拆分这些集群中的任何一个。

【讨论】:

非常感谢您的回复和解释。 hierarchical clustering 是最接近我想要的。我已经提出了一些想法,我需要的是根据位置和价格创建集群。 hierarchical clustering 的结果对我来说非常合理。 您能告诉我们您通过什么实现产生了这些结果吗?这是在r 中实现的吗? 我使用 ELKI 绘制这些图,因为它非常支持半正弦距离。 谢谢,我去看看。 @Anony-Mousse 我在 ELKI GUI 中尝试了您使用的参数,它运行良好,但是当直接在 Java 中使用它时,它返回一个集群。【参考方案2】:

你可以使用Hullplot 在你的情况下

hullplot(select(data, lng, lat), cluster.dbscan$cluster)

【讨论】:

以上是关于DBSCAN 按位置和密度对数据进行聚类的主要内容,如果未能解决你的问题,请参考以下文章

基于密度的聚类方法

聚类聚类算法(K均值层次聚类DBSCAN)的对比与评估

深度解读 python 实现 dbscan算法

DBSCAN密度聚类

具有噪声的基于密度的空间聚类算法--DBSCAN

聚类算法--DBSCAN