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

时间:2020-09-15 21:11:34

标签: r cluster-analysis dbscan

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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


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

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

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