聚类算法通常考虑到人类可能认为合理的聚类是模棱两可的,并且计算的解决方案应该能够很好地概括和预测。
这就是为什么我犹豫是否只针对我的具体情况使用久经考验的算法——这并不意味着我确信那些不会起作用或实际上可能是最佳的。我只是想验证一下。
那么让我们看看下面的例子。
本质上,集群是显而易见的,除了明确的例外,因为它们实际上是线性可分的。我指的数据是二维的。集群遵循具有模式的未知分布并且是独立的。
对于这种特定的集群模式,哪种算法表现良好(速度、鲁棒性、简单性)?
rotate <- function(xy, deg, cen) {
xy <- xy - cen
return(c(
xy[1] * cos(deg) - xy[2] * sin(deg),
xy[2] * cos(deg) + xy[1] * sin(deg)
) + cen)
}
G <- expand.grid(1:2,1:2)
S <- list()
N <- 100
for(i in 1:nrow(G)) {
set <- data.frame(x = rgamma(N,3,2)*0.2 + G[i,1], y=rgamma(N,3,2)*.1 + G[i,2])
S[[i]] <- t(apply(set,1,rotate,runif(1,0,pi),c(mean(set[,1]),mean(set[,2]))))
}
S <- do.call(rbind, S)
plot(S)