R 基于密度的群集,允许用户指定群集数量

R 基于密度的群集,允许用户指定群集数量,r,cluster-analysis,dbscan,R,Cluster Analysis,Dbscan,我有一张二维图上大约100000个点的数据。每个点都有X和Y坐标。我正在寻找一种基于密度对这些点进行聚类的算法,但我想指定聚类的数量 我最初尝试K-Means,因为它允许我指定集群的数量。然而,我的数据自然会“聚集”成脊状。K-Means不可避免地会将这些山脊中的一些一分为二。仅仅由于数据的形状,DBSCAN看起来更适合,但是使用DBSCAN,我无法指定我想要的集群数量 本质上,我试图找到的是一种算法,它可以根据密度将图形最佳地分为N组。其中N由我提供。在这一点上,我不在乎它在哪里实现(R、Py

我有一张二维图上大约100000个点的数据。每个点都有X和Y坐标。我正在寻找一种基于密度对这些点进行聚类的算法,但我想指定聚类的数量

我最初尝试K-Means,因为它允许我指定集群的数量。然而,我的数据自然会“聚集”成脊状。K-Means不可避免地会将这些山脊中的一些一分为二。仅仅由于数据的形状,DBSCAN看起来更适合,但是使用DBSCAN,我无法指定我想要的集群数量

本质上,我试图找到的是一种算法,它可以根据密度将图形最佳地分为N组。其中N由我提供。在这一点上,我不在乎它在哪里实现(R、Python、FORTRAN…)


如果您能提供任何方向,我们将不胜感激。

在高密度区域,点往往靠近,因此(欧几里德)距离上的聚类可能会给出类似的结果(并非总是如此)

例如,对于二维中的这三条法线:


x1 <- mnormt::rmnorm(200, c(10,10), matrix(c(20,0,0,.1), 2, 2))
x2 <- mnormt::rmnorm(100, c(10,20), matrix(c(20,0,0,.1), 2, 2))
x3 <- mnormt::rmnorm(300, c(23, 15), matrix(c(.1,0,0,35), 2, 2))

xx <- rbind(x1, x2, x3)

plot(xx, col=rep(c("grey10","pink2", "green4"), times=c(200,100,300)))


x1您是否考虑过分层聚类(带病房链接)?在我的手上,根据距离分开效果相当好。您可以在
cutree
中指定
k
。谢谢,@Alexlok!我给你打个电话try@Alexlok这对我来说非常有效。如果你想转载你的评论作为回答,我会将其标记为接受。再次感谢!
# hierarchical
clustering <- hclust(dist(xx,
                          method = "euclidian"),
                     method = "ward.D")
h.cl <- cutree(clustering, k=3)

# K-means and dbscan
k.cl <- kmeans(xx, centers = 3L)
d.cl <- dbscan::dbscan(xx, eps = 1)
opar <- par(mfrow=c(3,1), mar = c(1,1,1,1))

plot(xx, col = k.cl$cluster, main="K-means")
plot(xx, col = d.cl$cluster, main="DBSCAN")
plot(xx, col = h.cl, main="Hierarchical")

par(opar)