距离矩阵的聚类算法

数据挖掘 Python 聚类 距离
2021-09-25 01:41:43

我有 N 个对象之间的相似度矩阵。对于每 N 个对象,我可以衡量它们彼此之间的相似程度 - 0 相同(主对角线)并且随着它们变得越来越不相似而增加值。类似的东西(如果我说要聚集在一起的 10 000 个元素,实际矩阵将是 10 000 x 10 000):

[ 0 5 12 7 ]
[ - 0 9  2 ]
[ - - 0  6 ]
[ - - -  0 ]

(假设索引从 0 开始)所以这里 object_0 与 object_1 (5) 最相似,但 object_1 本身与 object_3 (2) 更相似,等等。

我想将其分为 k 组,以最小化总体得分或集群内得分。我不确定这实际上是否会产生很大的不同。我还没有检查过这方面的数学,但我觉得在某些情况下,最小化特定集群的分数不一定会最小化总体分数(在所有集群中)。归根结底,即使严格地考虑可能存在差异,我实际上可能并不关心结果是否足够接近。

一些细节:

  • 集群不必大小相等
  • 我真的不介意集群的数量是输入还是由算法本身以某种方式决定(我想我更喜欢输入它)
  • 通常我会有大约 10 000 个元素进行聚类。如果我推动它,也许 40 000。但后来我可能需要为一堆这样大小的矩阵重复运行它。

在执行此操作的算法/库之上,奖励积分:

  • 一些已经实现它的库,所以我希望可以为它正确格式化数据,并在我花费大量时间之前看看它是否能给出好的结果
  • 对于这样的lib,支持并行处理
  • 其他漂亮的花里胡哨(如最大迭代次数、输入一些停止标准的能力等)

如果做不到这一点,当然它也可能只是一些允许我将它们分组的伪代码。

3个回答

在 HDBSCAN (Hierarchical DBSCAN ) 的文档中,有一个非常好的聚类算法比较它有点偏颇,突出了自己的优势(当然),但仍会为您提供示例和一些样板代码,以便快速启动和运行。众所周知,DBSCAN 和 HDBSCAN 不太擅长处理集群中的高方差。如果这最终对您的用例很重要,您可能想考虑使用 OPTICS,它更擅长处理这个问题。

或者,退后一步,您可以尝试计算之间的距离

还有另一个名为 的库pyclustering,其中包含许多算法以及一组示例这些算法主要在底层用 C++ 实现,因此通常比标准 Python 库中的版本快得多。

有数百种算法可供选择。

  • 层次聚类在它的无数变体中。根据需要切割树状图,例如,得到 k 个簇
  • PAM,距离矩阵上与 k-means 最接近的匹配(最小化与聚类中心的平均距离)
  • 光谱聚类
  • 星展扫描
  • 光学
  • HDBSCAN*
  • 亲和传播
  • ...

除了前面的答案中提到的之外,请看一下 DDCRP(距离相关的中餐厅流程),它不需要集群数量作为输入,并且具有一系列阈值和标准来获得所需的集群。