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 按位置和密度对数据进行聚类的主要内容,如果未能解决你的问题,请参考以下文章