我正在处理GPS数据(纬度,经度)。对于基于密度的聚类,我在R中使用了DBSCAN。
DBSCAN在我的案例中的优势:
我可以计算距离矩阵(使用Haversine Distance 公式)并将其用作dbscan中的输入
library(fossil)
dist<- earth.dist(df, dist=T) #df is dataset containing lat long values
library(fpc)
dens<-dbscan(dist,MinPts=25,eps=0.43,method="dist")
现在,当我查看群集时,它们没有意义。有些星团的点数相差超过1公里。我想要密集的簇,但不是那么大。
MinPts
和eps的不同值得到了处理,我还使用k最近邻距离图来获得eps
= 25的最佳值MinPts
dbscan
正在做的是我的数据集中的每个点,如果点p在MinPts
邻域中有eps
,它将构成一个群集但同时它也是加入密度可达的集群(我想这对我来说是个问题)。
这确实是一个很大的问题,特别是“如何在不过多影响其信息的情况下减少群集的大小”,但我会将其记录为以下几点:
dens$cluster
,但我怎么知道a
特别是核心还是边界?eps
相当。但事实并非如此,因为密度可达
集群组合在一起。dbscan
的优势
但是能给我更有意义的集群吗? OPTICS
是另一种选择,但它会解决我的问题吗?
Note:
有意义的我想说更接近的点应该在群集中。但是相距1公里或更远的点不应该在同一个星团中。
答案 0 :(得分:6)
DBSCAN并未声称半径是最大簇大小。
你读过这篇文章吗?它正在寻找任意形状的集群; eps
只是一个点的核心大小;大致用于密度估算的大小; 核心点半径内的任何点都将成为群集的一部分。
这使得它基本上是连接密集点的最大步长。但它们仍然可能形成一系列密度连接点,具有任意形状或大小。
我不知道R实现中的集群0是什么。我已经尝试过R实现,但是 waaaay 比其他所有实现慢。我不建议使用R,有更好的集群分析工具,例如ELKI。尝试使用您在ELKI上的设置运行DBSCAN,使用LatLngDistanceFunction和sort-tile-recursive加载的R-tree索引。与R相比,你会惊讶地发现它有多快。
OPTICS正在寻找相同的密度连接类型的群集。你确定这种任意形状的簇是你正在寻找的吗?
恕我直言,你的目标使用了错误的方法(你并没有真正解释你想要实现的目标)
如果您想要对群集直径进行硬限制,请使用完整链接层次聚类。