我正在尝试开发一种聚类算法,该算法的任务是使用一组经过稍微修改的Kruskal算法来查找k个生成树而不是一个,从而在一组2D点上找到k个类(输入k个)。
我将我的输出与使用rand指数的建议最佳值(1)进行了比较,对于k = 7,结果为95.5%。可以在下面的链接上看到比较。
问题:
该集合具有5个明显隔开的簇,可以通过算法轻松分类,但是当k> 5时,结果变得令人失望,这是事情开始变得棘手的时候。我相信我的算法是正确的,也许对于Kruskal方法而言,数据特别糟糕。众所周知,诸如Kruskal的单链接聚集聚类在某些问题上表现不佳,因为它将聚类质量的评估降低为一对点之间的单个相似性。
该算法的思想非常简单:
是这对之间的欧几里得距离。
底线:
为什么算法会那样失败?是克鲁斯卡尔的错吗?如果是这样,为什么呢?有什么建议可以在不放弃Kruskal的情况下改善结果吗?
(1):Gionis,A.,H。Mannila和P.Tsaparas,聚类聚集。进行ACM交易
从数据中发现知识(TKDD),2007.1(1):p.1-30。
最佳答案
这被称为单链接效果。
Kruskal似乎是计算单链接集群的一种半巧妙的方法。 “分层聚类”的幼稚方法是O(n^3)
,由于必须对O(n^2 log n)
边缘进行排序,因此Kruskal方法应该是n^2
。
请注意,SLINK可以在O(n^2)
运行时和O(n)
内存中进行单链接群集。
您是否尝试过加载数据集,例如放入ELKI,并将您的结果与单链接聚类进行比较。
要获取bette结果,请尝试其他链接(通常在O(n^3)
运行时中)或基于密度的集群,例如DBSCAN(在没有索引的O(n^2)
中和在有索引的O(n log n)
中)。在此玩具数据集上,epsilon=2
和minPts=5
应该可以正常工作。