识别非模糊聚类的算法?

时间:2014-07-26 11:49:18

标签: algorithm machine-learning cluster-analysis spatial-data

聚类算法通常会考虑到人类可能认为合理的聚类是模糊的,并且计算出的解决方案应该很好地推广和预测。

这就是为什么我犹豫是否仅仅根据我的具体情况使用经过试验和测试的算法 - 这并不意味着我确信那些不会起作用或者实际上可能是最佳的。我只想验证一下。

让我们看看下面的例子。

enter image description here

基本上,集群是显而易见的,除了异常之外,因为它们实际上是线性可分的。我所指的数据是二维的。群集遵循具有模式的未知分布并且是独立的。

对于这种特定的群集模式,什么算法能够很好地执行(速度,健壮性,简单性)?


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)

4 个答案:

答案 0 :(得分:1)

您可以尝试alpha形状。它是一个delaunay三角剖分,边缘被删除超过alpha。

答案 1 :(得分:1)

大多数算法都应该在数据上做得很好。

另请参阅基于密度的聚类,例如均值漂移,DBSCAN。

但实质上,任何人都应该这样做。获取一个包含各种算法(如ELKI)的工具包,并尝试一些。

答案 2 :(得分:1)

标准的k-means聚类对你给出的图片效果很好。一般来说,k-means聚类对于像你这样的图像很有效,除非你的一些聚类是细分的椭球并且一个椭球的中心靠近另一个椭圆的中心点。如果是这种情况,那么您可能最好使用其中一种聚类思想,这些思想贪婪地将彼此最接近的点聚集在一起,然后分层次地保持合并附近的点组,直到达到距离阈值达到点组之间(或者如果您提前知道了簇的数量,则达到所需的簇数)。

关于k-means聚类的唯一事情是,如果你现成使用它,那么你需要知道你想拥有多少个聚类。有多种方法可以根据数据选择群集数量,但如果您不知道要选择多少群集,请在线查看,如果您有兴趣的话。

答案 3 :(得分:0)

我同意基于密度的聚类建议(例如,均值漂移)。我假设你的意思是每对簇都是线性可分的?如果要自动检查任何两个簇是否可线性分离,看起来您可以计算它们的凸包并检查它们是否相交: Determine whether the two classes are linearly separable (algorithmically in 2D)

因此理论上你可以运行几个具有不同内核带宽的均值漂移试验,检查每个集群线性可分离性与其他每个集群的关系,并跟踪某些类型的集群分数(参见此处的评估和评估部分{{3} })。

虽然您的数据可能看起来很明显,但是提出了一个通用的解决方案,以便始终产生明显的&#34;除非你有一些领域知识可以利用,否则输出并不是微不足道的。例如,如果你可以使你的平均移位内核带宽(你强调的每个点附近的邻域)成为某个域属性的函数,那么它可能会更容易。