我有一个列表中的不透明的对象。我只能计算出它们之间的距离(不正确的,只是设置条件的问题):

class Thing {
    public double DistanceTo(Thing other);
}

我想这些集群对象。我想要控制群集的数量和我想的"关闭"的对象是在同一个集群:

List<Cluster> cluster(int numClusters, List<Thing> things);

任何人都可以建议(和链接;-))某些群算法(于更简单、更好!) 或图书馆,可以帮助我吗?

澄清 最群算法要求,目的是奠定了在一些N-维的空间。这种空间是用来寻找"重心"的集群。在我的情况下,我不知道什么,N,我也不知道如何提取的坐标系统从物体。 我所知道的是如何远2的对象。 我想找到一个很好的聚类分析算法,只使用这些信息。

想象一下,你们聚集的基础"闻"的对象。你不知道怎么放"闻出"在2D飞机,但是,你知道是否有两个闻起来都是类似的,或没有。

有帮助吗?

解决方案

我认为你是在寻找 K-Medoids.这就像K-意味着在指定的群集的数目, K, 在前进,但它不需要你有一个概念,"平均"的对象,你在聚类似的K-装置。

相反,每一个群集的具有代表 medoid, ,这是该成员的集群最接近中间。你可能会认为它作为一个版本的K-意味着认为"中位数"而不是"手段"。所有你需要的是一个距离指标群集的事情,和我已经使用这在一些我自己的工作完全相同的原因你举.

天真的K-medoids不是最快的算法,但是有快速的变量可能不够好您的目的。这里描述的算法,并链接到该文件对于他们实现在 R:

  1. PAM 是的基本O(n^2)实现的K-medoids.
  2. 克拉拉 是一个速度更快,采样版本的PAM。它的工作通过聚类随机抽样对象的子集与PAM和分组的整个集合的对象根据子集。你应该还是能够得到很好的clusterings快这一点。

如果你需要更多的信息, 这里有一个纸 这一概述了这些和其他K-medoids方法。

其他提示

这里有一个大纲,为一个群集的算法,没有K意味着需要寻找一个心。

  1. 确定之间的距离所有的对象。记录 n 大多数独立的对象。
    [找到根源,我们的集群、时间O(n^2)]
  2. 分配给每一个这些 n 随意点 n 新的不同的集群。
  3. 对于每一个其它的对象:
    [将对象分配给集群、时间O(n^2)]
    1. 对每个集群:
      1. 计算平均距离从一个集群,目的平均距离的每个对象群集中的对象。
    2. 分配的对象到的最接近的集群。

这个算法将肯定集群的对象。但是它的运行时 O(n^2).再加上它引导通过那些第一次 n 点选择。

任何人都可以改善在这个(更好的运行时性,较少依赖于最初的选择)?我很想看看你的想法。

下面是一个简单的算法。

While (points_left > 0) {
 Select a random point that is not already clustered
 Add point and all points within x distance 
   that aren't already clustered to a new cluster.
}

可替换地,读取维基百科页。 K-均值聚类是个不错的选择:

  

在K-means算法给每个点的中心(也称为质心)是最近的群集。该中心是在集群中的所有的点的平均 - 也就是说,其坐标是算术平均分别为每个维度在集群中的所有点

。      

该算法的步骤是:

* Choose the number of clusters, k.
* Randomly generate k clusters and determine the cluster centers, or
  directly generate k random points as cluster centers.
* Assign each point to the nearest cluster center.
* Recompute the new cluster centers.
* Repeat the two previous steps until some convergence criterion is
  met (usually that the assignment hasn't changed).
     

该算法的主要优点   是它的简单性和速度,这   允许它在大型数据集上运行。   它的缺点是,它不   每次运行时产生相同的结果,   因为得到的簇取决于   初始随机分配。它   最小化簇内方差,但   不保证结果具有   全球最小方差的。另一个   缺点是要求   平均的概念是可定义   这并非总是如此。对于这样   数据集的k中心点划分变体是   合适的。

这个怎么样的办法:

  1. 分配的所有对象的一个集群。
  2. 找到两个目的, 一个b, 那是在同一个集群, k, ,这是最大的距离。为了澄清,应该有一个 一个b 对于整体设置的,而不是一个 一个b 对每个集群。
  3. 分的集群 k 为两个集群, k1k2, 一对象 一个 和一个与对象 b.
  4. 对于所有其他对象群 k, ,加入他们么 k1k2 通过确定最低平均距离的所有其它目的在于集群。
  5. 重复步骤2-5至N集群的形成。

我认为这种算法应该给你一个相当不错的聚类,虽然其效率可能很糟糕。提高效率,你可以改变的步骤3所以是你找到的最小距离,只有原来的对象,启动群集,而不是平均距离为所有对象都已经在集群。

系统发育的DNA序列分析定期使用分层聚集在文字符串,[校准]距离矩阵。这是一个很好R教聚类:

(快捷方式:直接去"层次凝"部...)

这里有一些其他[语言]图书馆:

这种办法可能有助于确定有多少[k]"自然"集群的存在和其对象使用作为根k装置的方法上。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top