我正在尝试开发一种聚类算法,其任务是在一组2D点上找到k类(使用k作为输入),使用轻微修改的Kruskal算法来找到k生成树而不是一个。
我使用兰特指数将我的输出与建议的最优值(1)进行了比较,对于k = 7,我得到了95.5%。比较可以在下面的链接中看到。
问题:
该组具有5个明显间隔的簇,这些簇很容易被算法分类,但是对于k> 1,结果相当令人失望。 5,这是事情开始变得棘手的时候。我相信我的算法是正确的,也许数据对于Kruskal方法特别糟糕。众所周知,单链接聚合聚类(如Kruskal)在某些问题上表现不佳,因为它将聚类质量评估降低到一对点之间的单一相似性。算法的想法非常简单:
底线: 为什么算法失败了?这是Kruskal的错吗?如果是这样,为什么呢?任何改善结果的建议没有放弃Kruskal?
(1):Gionis,A.,H。Mannila和P. Tsaparas,聚类聚合。 ACM交易 数据知识发现(TKDD),2007.1(1):p.1-30。
答案 0 :(得分:4)
这称为单链接效果。
Kruskal似乎是一种计算单连锁聚类的半聪明方式。用于"层次聚类的天真方法"是O(n^3)
,由于必须对O(n^2 log n)
边缘进行排序,Kruskal方法应为n^2
。
请注意,SLINK可以在O(n^2)
运行时和O(n)
内存中进行单链接群集。
您是否尝试过加载数据集,例如进入ELKI,并将结果与单链路聚类进行比较。
要获得更好的结果,请尝试其他链接(通常位于O(n^3)
运行时)或基于密度的群集,例如DBSCAN(O(n^2)
无索引,O(n log n)
指数)。在此玩具数据集中,epsilon=2
和minPts=5
应该可以正常使用。
答案 1 :(得分:1)
群集之间的桥梁应该是不同的,这是Kruskal犯错误的典型例子。对于每个点,您可以尝试用距离该点的第二个最短距离覆盖该点的最短距离 - 这可能会增加桥中的长度而不会增加其他长度。
通过眼睛,这看起来像K-means可能做得很好 - 除了左上角,群集几乎是圆形。
答案 2 :(得分:0)
您可以尝试曼哈顿距离,但为了更好,您可以尝试经典的线和圆检测算法。