基于密度的聚类,允许用户指定聚类数

Density based clustering that allows user to specify number of clusters

我的数据由二维图上的大约 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,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)))

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

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

当然,不能保证这对您的特定数据有效。