1

聚类算法通常考虑到人类可能认为合理的聚类是模棱两可的,并且计算的解决方案应该能够很好地概括和预测。

这就是为什么我犹豫是否只针对我的具体情况使用久经考验的算法——这并不意味着我确信那些不会起作用或实际上可能是最佳的。我只是想验证一下。

那么让我们看看下面的例子。

在此处输入图像描述

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

对于这种特定的集群模式,哪种算法表现良好(速度、鲁棒性、简单性)?


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

4 回答 4

1

大多数算法应该像这样简单地处理数据。

还可以查看基于密度的聚类,例如均值偏移、DBSCAN。

但本质上,任何人都应该这样做。获取具有多种算法选择的工具包,例如 ELKI,并尝试一些。

于 2014-07-26T15:19:10.010 回答
1

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

关于 k-means 聚类的唯一一点是,如果您使用现成的,那么您需要知道您想要拥有多少个聚类。有一些方法可以根据数据来选择集群的数量,如果你不知道要选择多少集群,有兴趣的可以上网看看。

于 2014-07-26T20:41:49.380 回答
1

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

于 2014-07-26T13:38:16.343 回答
0

我同意基于密度的聚类建议(例如,均值偏移)。我假设您的意思是每对集群都是线性可分的?如果您想自动检查任何两个集群是否是线性可分的,看起来您可以计算它们的凸包并检查它们是否相交: 确定这两个类是否是线性可分的(在 2D 算法中)

所以理论上你可以用不同的内核带宽运行几次均值漂移试验,检查每个集群与其他集群的线性可分性,并跟踪某种类型的集群分数(请参阅此处的评估和评估部分http://en.wikipedia .org/wiki/Cluster_analysis)。

尽管您的数据可能看起来“显而易见”,但提出一个始终产生“显而易见”输出的通用解决方案并非易事,除非您有一些领域知识可以利用。例如,如果您可以使您的均值偏移内核带宽(您强烈加权的每个点周围的邻域)成为某个域属性的函数,它可能会更容易。

于 2014-08-05T02:42:40.280 回答