这是一篇研究聚类的文章。对于聚类的点来说,它可能同时具有一些属性,包括数值型的(大小和差值是有具体意义的),bool(True/False)类型的,还有类别类型的(一个数字代表一个类别,大小无意义)。对于后两种类型的属性,直接算距离就不合理。所以作者就开发了一个基于Hierachical的聚类算法,在合并cluster(簇)的时候,没有使用距离,而是使用了links这种度量。最后,作者使用ROCK进行了实验,在实际应用和合成数据集上work well,并且具有很好的可拓展性。
聚类方法主要可以分成两类,第一类是基于分区聚类(partitional clustering)还有hierarchical clustering。
第一类的表达式如下:
预先分成k组,然后运用某种度量计算每一个点与类中心点距离。
这种聚类比较适合于数值类型的数据,不太适合于有很多类别数据,bool型数据的点。
一个motivating example就是说,对于经常买一些比较贵产品的人来说,他们购买的东西类别交集很小。但是有一个共同点是都很贵,这个时候直接算他们的距离很小,这很不合理。合理的方式,使用一些links将他们连接起来(比如A与B常常一起出现,B与C常常一起出现,A与C应该是有某种联系的),体现出他们的相似性。而且,这种算法会倾向于将大的cluster切分。
另一种hierarchical clustering的算法可能也不是很行。centroid based agglomerative hierarchical clustering algorithm就是,开始的时候,每一个点都是一类。然后计算每两类的质心,或者平均值。距离最近的俩合并到一起。但是基于质心的这种度量其实也是很差的。并且不同簇的点划分到同一个簇之后,会越来越差。可以想像一下,这种算法其实是很难区分一些属性完全不同和所有属性都有一点小不同的。还有一些基于文本的聚类,相似度是用Jaccard Coefficient这种来度量的,但是其质心不是数值型的,所以这种也没法用。
作者的方法:
选取一种度量(可以是Jaccard Coefficient或者查表之类的)。当两个点的度量超过一定阈值的时候,称它们俩为邻居。两个点之间的links就是它们共同的neighbor数。在merge cluster的时候,选取links最多的cluster进行merge。
首先,定义neighbor:
( heta)是超参数。
文章想要极大化这个目标:
直接算最大links是不行的,因为没办法防止算法把所有点放到一个cluster里面。所以要除一个数:
(n_i^{1+2*f( heta)}),(n_i^{f( heta)})表示一个cluster里面neighbors。
为了选取俩cluster进行合并,所以作者设计了一个metric:
整体的算法流程:
Q是一个全局大根堆,q[i]是一个局部大根堆。
Q里面存的是所有cluster对其他cluster的goodnees的最大值。q[i]里面是第i个cluster与其他cluster的goodness。10-15行是因为形成了新的邻居,所以进行了一次更新。
关于计算links,由于矩阵是稀疏的,下面的算法可以提供更快的方式(枚举中间点):
最终复杂度:
ROCK算法缺点:
(1)相似度阈值需要预先指定,阈值对聚类质量影响很大,在对数据集没有充分了解的前提下很难给出合理的阈值;
(2)在ROCK算法中,相似度函数仅被用于最初邻居的判断上,只考虑相似与否,而未考虑相似程度,是算法对相似度阈值过于敏感;
(3)ROCK算法还要求用户事先选定聚类簇数 k。