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平面上"散发出气味",但你知道两种气味是否相似.
我想你正在寻找K-Medoids.它就像K-means,因为你预先指定了簇的数量K,但它并不要求你有一个像K-means那样"平均"你正在聚类的对象的概念.
相反,每个群集都有一个代表性的medoid,它是最接近中间的群集的成员.您可以将其视为K-means的一个版本,它可以找到"中间人"而不是"手段".您所需要的只是一个用于聚类事物的距离度量,我在我自己的一些工作中使用它的原因与您引用的原因完全相同.
天真的K-medoids不是最快的算法,但有一些快速的变种可能足以满足您的需要.以下是算法的描述以及R中实现文档的链接:
如果您需要更多信息,请参阅这篇文章,概述这些和其他K-medoids方法.