如何聚类对象(没有坐标)

Fra*_*ger 8 language-agnostic algorithm cluster-analysis

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

class Thing {
    public double DistanceTo(Thing other);
}
Run Code Online (Sandbox Code Playgroud)

我想聚集这些对象.我想控制集群的数量,我希望"关闭"对象在同一个集群中:

List<Cluster> cluster(int numClusters, List<Thing> things);
Run Code Online (Sandbox Code Playgroud)

任何人都可以建议(并链接到;-))一些聚类算法(更简单,更好!)或可以帮助我的库?

澄清大多数聚类算法要求将对象布置在某个N维空间中.该空间用于查找聚类的"质心".就我而言,我不知道N是什么,也不知道如何从对象中提取坐标系.我所知道的是两个物体相隔多远.我想找到一个只使用该信息的良好聚类算法.

想象一下,你是根据物体的"气味"聚类的.你不知道如何在2D平面上"散发出气味",但你知道两种气味是否相似.

Tod*_*lin 6

我想你正在寻找K-Medoids.它就像K-means,因为你预先指定了簇的数量K,但它并不要求你有一个像K-means那样"平均"你正在聚类的对象的概念.

相反,每个群集都有一个代表性的medoid,它是最接近中间的群集的成员.您可以将其视为K-means的一个版本,它可以找到"中间人"而不是"手段".您所需要的只是一个用于聚类事物的距离度量,我在我自己的一些工作中使用它的原因与您引用的原因完全相同.

天真的K-medoids不是最快的算法,但有一些快速的变种可能足以满足您的需要.以下是算法的描述以及R中实现文档的链接:

  1. PAM是K-medoids的基本O(n ^ 2)实现.
  2. CLARA是PAM的快速采样版本.它的工作原理是使用PAM对随机采样的对象子集进行聚类,并根据子集对整个对象组进行分组.你仍然应该能够快速获得非常好的聚类.

如果您需要更多信息,请参阅这篇文章,概述这些和其他K-medoids方法.