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

问题描述

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

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

基本上,我要寻找的是一种算法,该算法将基于密度将图最佳地聚类为N个组。其中N由我提供。此时,我不在乎它的实现位置(R,Python,FORTRAN ...)。

您能提供的任何方向将不胜感激。

解决方法

在高密度区域中,这些点趋于彼此靠近,因此在(欧几里得)距离上聚类可能会得到相似的结果(并非总是如此)。

例如,使用这三个法线在二维中:


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

xx <- rbind(x1,x2,x3)

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

three clusters in 2 dimensions

我们可以应用不同的聚类算法:

# 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)

我们在这个特定示例上看到,层次聚类和DBSCAN产生了相似的结果,而K-means却以错误的方式切割了一个聚类。

opar <- par(mfrow=c(3,1),mar = c(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)

the same data clustered with 3 algorithms

当然,不能保证这将对您的特定数据起作用。