作者:Tsaipei Wang, Member, IEEE
发表:IEEE TRANSACTIONS ON SYSTEMS, MAN, AND CYBERNETICS—PART B: CYBERNETICS, VOL. 41, NO. 3, JUNE 2011
这是一遍关于聚类集成的论文,作者提出了一种聚类集成方法,命名为:CA-Tree,,基于层次结构(dendogram),这个结构的大致与hierarchical cluster 相同,当然是比hc 效果好,同时该方法适合用于数据样本比较大的时候,在数据样本量大时也能保证整个process 时间上的高效,接近于O(N),且有准确率有保证。
论文中主要的思想是,用一个代表一群样本,然后对代表进行类标识,代表中的样本就属于该类了。
该方法的优点有:
下面是一下参数的论文中的描述,尽量用相同的符号,可以先跳过,直接看我写的:
下面是算法的描述:
对于有N个样本的数据集:X = {x1, x2, . . . ,xN}。
对其分别进行H 次的聚类,h-th次的聚类结果记为:Ph= {C1, C2, . . . , Ck},k是该h-th 聚类算法类的个数,可以知道每个是不同的,这里下标就不标了,这里的C 就是类标号了。
那么对于一个样本xi,给他一个 1xH 的 λi 向量,表示在h-th 聚类算法中他属于哪个类,eg: H=2, λi =<4,10>,表示第一聚类算法中其属于第4个类,第二聚类算法中其属于第10个。
样本之间的距离使用海明距离(Hamming),即两向量中不同的位标记位1,同的标记位0,之和,记为:d(λi ,λj )。
上面的基础介绍,竟然知道了两个样本之间的距离那么可以算一下相似度矩阵了,注意的是该相似度矩阵只是作者提出的计算方法,在算法中不需要用到:
相似度矩阵:
对于一个聚类算法结果,计算一个相似度矩阵,这个是原始的相似度矩阵,最终结果的相似度矩阵会有不同,对于同属于一类的标记为1,不同为0:
然后对于H 个相似度矩阵求个平均便是最终的相似度矩阵:
这个公式与下面等价:
构建CA-TREE:
回顾上面们说的,CA-TREE的思想是 用一个代表一群,这个一个怎么来下面说,来一个例子,下图是100个样本,真实分类如下:
在初始介绍的时候,我们知道了每个样本都有一个label vector λi,一个聚类算法中的类属,那么我们我们对上面这个初始数据k-means 下,k=3,4,5,6(上又),这就有4个聚类算法的结果了,这样100个样本的λ,可以知道这100个λ 里面有一些是完全相同的, 这样我们将完全相同的λ 对应的样本划分为一组,以论文的例子来这样一共划分了9组,表格如下,第一行数组号,第二行是该组的λ,第三行可以忽略。
在图上的反映如下:
通过简单的划分,便将100个样本划分成9个组,每组的用λ 作为标识,这样复杂度就降下来了,当然还有后面的。这里我们获得了9个组,接着就是构建树,我们有9个λ ,然后是构建树,论文中有算法流程,但是阅读起来很费经,我做一个理解转述:
看这个表中的label vactor,第一行,一共有3个不同的(1 2 3),那么节点便有3个子节点,每个子节点分配了符合的index,即1分支获得:1-4,2分支获得:5-6,3分子获得8-9;然后进入分支自己来,然后看第二行,1-4中的第二行的不同有2 3 ,所以该点分成两个分支,其他分支一样,直到4行聚类结果都用上了,生成一个5层的树,最底层的叶子只有一个index,如下右边:
这个树还需要"变形"一下,不过可以先描述一下的,树中的节点包括其分支中的所有叶子的index,例如第一行的根节点包括1-9 index,第二行的左边节点包括1-4 index,我们用z 来表示一个节点,这个有可能是分支节点,也有可能是叶子,那么X(z) 表示z有的样本,而G(z) 表示z有的全部label vector,G(z)需要搞明白,z 为叶子时候,那么G(z) 就是该index 的label vector,如果z 为根节点,那么G(z) 则为 1-9 index 的label vector。
搞清楚了G(z)的含义后,我们定义节点的 size,这个size 计算如下,首先我们定义一个label vector (λ) 与G(z) (一组λ) 的距离:
知道了一个label vector 与一组label vector 的距离计算,我们每个节点z 都有一组label vector G(z),那么每个节点需要选出一个label vector 作为其代表,方法就是遍历一下,选取是的上面这个最小的那个:
节点z 有了代表的label vector,那么节点的size 就选用,其实就是最小的那个距离:
既然有了节点的size,那么这个树可以改成如下,使用节点的size 作为层的选择,其实就是上面那颗树的中右分支拉下来了:
然而,上面的构建方法是全遍历,时间复杂度随着节点高度上升,时间变长(节点的label vector 多了,遍历时间长了),而且可能出现多个多个满足的代表λ,例如 index 7,8,选7的label vector 作为代表那么 与 index 9 的结合的size 为2,选择8作代表那么size 为1 ,所以需要改进。
改进方法:
上面的方法主要原因是上层节点确认代表的label vector 时候遍历时间长,可以发现其实不需要全遍历,从这方面入手,减少需要遍历的label vector,我们记Z'(z)为z 节点的孩子及孙子节点,当然不是全部的子孙节点都包括,不然就不能提速了,这个怎么选,后面会描述,同时注意到d(,)公式使用的是海明距离,那么其是有上界 H的,那么上面的公式一个 label vector 与节点的距离可以修改为:
{} 中左边其实就是距离的上界,右边的是从Z'(z) 中选择节点的代表计算其距离加上该节点的size,可以知道只要限制了Z'(z) 的个数,那么这个计算时间上便有上界,此时z 节点的代表选择方法如下,其中G'(z)为Z'(z)的中全部节点的代表label vector:
,
此时的z 节点的size 便如下:
可以看出只要限制了 Z'(z)的个数,便能够提高效率,下 Z'(z) 的确定方法:将z 节点的全部孩子节点(不包括孙子)放入篮中,然后对篮子中的最大的节点取出,放入其的孩子节点,循环这个步骤直到篮中的全部节点都为叶子,或者篮中的节点数超出阀值。
例子说明:假如我们求 z为1 的时候,我们设阀值=2,那么Z'(z) 包括的节点有 2,3,符合要求了。假如我们设阀值为3,那么初始时候包括的节点为2,3,然后2会被取出来,放入其孩子节点 4,5,此时便有 4,5,3。 论文中选择的阀值为ndes=32.
可以看出这样的改进是从下往上的,上层计算基于下次的结果,同时Z'(z) 会有上界,因为其符合:
切割:
通过上面的方法,我们有效地构建了这颗CA-tree,到确定类划分,跟hc 的方法类似,上面我们提到需要一个临界值来划分,如何这样我们选取后,如下图的虚线,那么虚线下的每一个分支便作为一类,如图的划分类数变为5,通过调整这个临界值,可以划分成不同的类数,临界值记为τ,切割方法记为Z(τ),类个数记为Nz(τ)
更新的相似度矩阵计算方法:
下图是临界值不同选择的结果,上面的对应结果为b 图,当临界为2时候,便与真实结果一样,abcd 对应的类数为 6543
限制:
注意到,例如上面的a图,其中的组的sample 占了很多,所以对于选择临界值选择后,进行进一步的限制,减少类数,Nz(τ) 成一个系数γ,变行,例如下图,我们选择为虚线切割,那么会分成5个类,如果γ=0.8,那么 最终的类数=4,加入节点4的sample 数最少,那么其变被排除在外,另外4个分支各成为1类。
好了,现在的问题是怎么确定4节点对应的样本(们)的类标号,我们知道节点4的label vector,按论文的说法是:对于确定的分支节点(上图有箭头除了4的4个节点),即他们的祖先们,构建一棵树,然后确定4的类标号时候,从这颗树的根节点触发,迭代寻找其孩子节点与4 的了label vector 最相似的节点,迭代到这棵树的叶子,便用这叶子节点的类数,上图中的4类标号用的是5节点的类标号。
我感觉或许会有多个的情况,但不深究这个了。
到此ca-tree聚类集成算法描述完毕,实验结果看论文吧,论文中有时间分析。