我正在尝试开发一种聚类算法,该算法的任务是在一组 2D 点上查找 k 个类(将 k 作为输入),使用经过轻微修改的 Kruskal 算法来查找 k 个生成树而不是一个。
我使用 rand 指数将我的输出与建议的最优值 (1) 进行了比较,对于 k = 7,结果为 95.5%。比较可以在下面的链接中看到。
问题:
该集合有 5 个间隔明显的簇,这些簇很容易被算法分类,但是当 k > 5 时,结果相当令人失望,这就是事情开始变得棘手的时候。我相信我的算法是正确的,也许数据对于 Kruskal 方法来说特别糟糕。众所周知,Kruskal 之类的单链接凝聚聚类在某些问题上表现不佳,因为它将聚类质量的评估降低到一对点之间的单个相似性。
算法的思想很简单:
- 用数据集做一个完整的图,边的权重是这对之间的欧几里得距离。
- 按权重对边缘列表进行排序。
- 对于每条边(按顺序),如果它不形成循环,则将其添加到生成林中。当所有的边都被遍历完或者剩余的森林有 k 棵树时停止。
底线: 为什么算法会这样失败?是克鲁斯卡尔的错吗?如果是这样,为什么?有什么建议可以在不放弃 Kruskal的情况下改善结果吗?
(1):Gionis, A.、H. Mannila 和 P. Tsaparas,聚类聚合。ACM Transactions on Knowledge Discovery from Data (TKDD),2007.1(1):p.1-30。