问题描述
我的数据在二维图形上大约包含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)))
我们可以应用不同的聚类算法:
# 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)
当然,不能保证这将对您的特定数据起作用。