以距离矩阵为输入的聚类[评估]算法

Posted

技术标签:

【中文标题】以距离矩阵为输入的聚类[评估]算法【英文标题】:Clustering [assessment] algorithm with distance matrix as an input 【发布时间】:2011-02-25 17:42:21 【问题描述】:

任何人都可以建议一些可以使用距离矩阵作为输入的聚类算法吗?还是基于距离矩阵也能评估聚类“好坏”的算法?

此时我正在使用 Kruskal 算法的修改 (http://en.wikipedia.org/wiki/Kruskal%27s_algorithm) 将数据拆分为两个集群。它有一个问题。当数据没有不同的集群时,算法仍然会创建两个集群,一个集群包含一个元素,另一个包含所有其余元素。在这种情况下,我宁愿有一个包含所有元素的集群,而另一个是空的。

是否有任何算法能够进行这种类型的聚类?

是否有任何算法可以估计聚类的效果,甚至更好地估计数据中有多少聚类?

算法应该只使用距离(相似度)矩阵作为输入。

【问题讨论】:

K-最近邻(en.wikipedia.org/wiki/KNN)是一种简单有效的聚类算法。稍作调整,它应该可以满足您的需求。 K 最近邻 - 起源于分类算法(我不知道如何在聚类中使用它)。最著名的方法之一是 K-means 聚类。 (en.wikipedia.org/wiki/K-means_clustering) 据我所知,在原始形式中,我需要此算法的坐标,而我没有。如何调整它以使其适用于距离矩阵? 据我了解,k-means 聚类是一种聚类分析算法,而不是聚类算法本身。 K-means 是一种分析集群优劣的好方法。由于 k-means 聚类问题是 NP-hard 问题,您需要使用其他算法来逼近理想的 k-means 聚类。 Lloyd 算法 (en.wikipedia.org/wiki/Lloyd's_algorithm) 不适用于距离矩阵,因为它需要计算簇质心(它也仅适用于在数据中查找预定义数量的簇)。 【参考方案1】:

或者可以评估的算法 聚类的“优点”也是 基于距离矩阵?

KNN 在评估聚类分配的“优点”时应该很有用。方法如下:

给定一个距离矩阵,每个点都根据其所属的集群进行标记(它的“集群标签”):

    根据 k 近邻分类隐含的集群标签测试每个点的集群标签 如果 k 近邻暗示另一个集群,则该分类点会降低集群的整体“良好”评级 总结每个像素的“良好评级”贡献,以获得整个集群的总“良好评级”

与 k-means 聚类分析不同,您的算法将返回有关分类不佳的点的信息。您可以使用该信息将某些点重新分配给新集群,从而提高集群的整体“优势”。

由于该算法对簇质心的位置一无所知,因此对全局簇密度一无所知,确保局部和全局密集的簇的唯一方法是在一定范围内运行该算法k 值,并在 k 值的范围内找到使优度最大化的排列。

对于大量积分,您可能需要优化此算法;可能使用哈希表来跟踪相对于每个点的最近点。否则这个算法将需要相当长的时间来计算。

【讨论】:

如果他已经知道了所有点之间的距离,那么KNN应该不会花太长时间。 KNN 的一大步通常是计算所有点之间的欧几里得距离。【参考方案2】:

可用于估计聚类数量的一些方法是:

Minimum Description Length Bayesian Information Criterion The gap statistic

【讨论】:

【参考方案3】:

scipy.cluster.hierarchy 运行 3 步,就像 Matlab(TM) clusterdata:

Y = scipy.spatial.distance.pdist( pts )  # you have this already
Z = hier.linkage( Y, method )  # N-1
T = hier.fcluster( Z, ncluster, criterion=criterion )

这里的linkage 可能是修改后的 Kruskal,不知道。 这个SO answer (咳咳)使用上述内容。 作为聚类的度量,radius = rms distance to cluster center是快速合理的, 对于 2d/3d 点。

告诉我们您的 Npt、ndim、ncluster、hier/flat 吗? 聚类是一个很大的领域,一个大小不能适合所有。

【讨论】:

以上是关于以距离矩阵为输入的聚类[评估]算法的主要内容,如果未能解决你的问题,请参考以下文章

谱聚类

白话啥是谱聚类算法

谱聚类算法总结

一种接受任意距离函数的聚类算法

聚类-层次聚类(谱系聚类)算法

密度峰值聚类算法(DPC)