对于越来越大的数据量,数据挖掘算法的时间效率成为了一个新的挑战。Grid Growing(http://sse.tongji.edu.cn/zhaoqinpei/)一种基于网格的聚类算法,它把数据空间量化为一定数量的单元,形成了网状结构,所有的聚类操作都是在分出的网格中进行的。它的特点是聚类过程都是基于每一个网格,而独立于数据集,处理速度有了很大的提高。
基本思想
将数据空间分成若干个大小相等的单元,则每个单元包含了一定数量的数据点,接着按照一定方式选取m个种子点,从每个种子点开始,选取与它们相邻的单元,如果那个单元的数据点数大于0,那么将这个单元和这个种子单元划分到相同的簇中,同时,考察这些相邻的单元,递归地将簇扩大,直到不能向外扩展。
- Grid Growing的输入参数
- 需要选取的初始种子单元的数量m
- 选取种子单元的方式
- 需要将数据空间等分的参数(每个维度需要等分的数量)
在二维空间中,我们可以输入参数Nx和Ny来决定将数据空间分成网格的数量,其中有部分网格是不包含数据的,下图显示了一个将一个二维数据空间分为2 * 2的情况:
算法中,选取所有数据点中每个维度的最大值和最小值,并将其差值等分成若干等分。上图中x维度最大值和最小值分别是26和2,那么把x维度分为2个等分,则每个网格在x维度的长度为(26-2) / 2 = 12。
在将数据空间等分为若干网格后,需要这些网格中选取m (m小于网格数)个网格作为种子单元,选取的方式有三种:
1. 选取密度最大的(包含数据点最多)的m个网格,如图3-7中,如果m=1,那么则选取包含6个数据点的那个网格
2. 采取随机的方式选取m个网格
3. 在空间中分布均匀地选取m个网格
在符合高斯分布的数据集中,第一种方法的效果最好,另外两种方法在特定的数据集中也能取得出较好的聚类结果,例如在一些分布整齐的数据集中,方法三的选取方式可能达到最好的效果。
Grid Growing算法最关键的步骤是从种子点开始向外扩展的过程,这也是每个簇形成的过程。下图中,数据空间被分为了8 * 4的32个网格,其中,密度最大的两个网格的编号为(3, 2)和(7, 4),他们分别含有10和13个数据点。
在二维网格中,从种子网格考察它周围的八个网格,如果那么网格的密度大于0,那么这个网格和这个种子网格就属于同一个区域(Region),这个区域中的数据点就属于同一个簇,同时将这个网格也作为一个新的种子点进行考察它周围的八个网格,按照这样的方式递归地扩大这个区域,同时也就能扩大了这个簇。
图中,编号为(2, 2)的网格是种子网格(3, 2)的邻居网格,而编号为(1, 1)的网格又是网格(2, 2)的邻居网格,所以它们同属于一个区域。这样,最终的聚类结果:
算法伪代码
Input:数据集D,分割数据空间的大小Nx, Ny, Nz....., 种子网格的个数,选择种子网格的方式
Output: 所有数据所属簇的编号
GridGrowingClustering(D, Nx, Ny, random, m){
Grids = getGrids(D,Nx,Ny)
SeedGrids = getSeedByRandom(Grids)
ClusterNumber = 1
For each seed in SeedGrids{
if seed is not visited
mark seed as visited
neighborhood = getNeighbors(seed, Grids)
qulifiedNeighborhood = notEmptyNeighors(neighborhood)
mark qulifiedNeighborhood as visited
mark ClusterNumber to seed and qulifiedNeighborhood
ExpandRegion(qulifiedNeighborhood, ClusterNumber,Grids)
ClusterNumber = ClusterNumber + 1
}
}
ExpandRegion(neighborhood, ClusterNumber,Grids){
For each grid in neighborhood{
neighborhood’ = getNeighbors(grid, Grids)
qulifiedNeighborbood’ = notEmptyNeighbors(neighborhood’)
mark qulifiedNeighborhood’ as visited
mark ClusterNumber to qulifedNeighborhood’.clusterNumer
ExpandRegion(qulifedNeighborhood’, ClusterNumber, Grids)
}
}
复杂度
Grid Growing算法在计算过程中需要遍历每一个网格点,因此它的时间复杂度和网格的个数有关,而网格的个数由输入参数决定。
以二维数据考虑,若整个数据集大小为N,将数据空间等分为Nx * Ny的网格,那么计算过程花费的时间为 t = 2N + 9 * Nx * Ny,因此算法的时间复杂度为O(N + Nx * Ny),而多数情况下,我们对Nx和Ny的取值时,都使得Nx * Ny 远小于 N,因此时间复杂可以是O(N),相对于其他聚类算法,具有一定的时间效率优势。
优缺点分析
Grid Growing是基于网格的聚类算法,但兼有DBSCAN的一些特征,总体上,它的
优点:
- 算法过程依赖于分割出来的所有网格,而不是所有的数据点,所以和其他聚类算法相比,它的处理速度非常快。
- 它扩展簇的方式和DBSCAN相同,均采用从种子点向外扩展的方法来发现簇,因此它可以发现任意形状的簇。
- 它对噪声点敏感,开始没有被选为种子网格或者之后没有被扩展到的网格都被认为是噪声,因此聚类结果不易受到噪声的干扰。
缺点:
- 输入参数较多,需要花比较长的时间在参数的选取上,一定程度上降低了算法的使用性:将数据空间分割成等分的网格的多少对最终的聚类结果有着很大影响,需要不断尝试,才能得到最优的分割方法。
- 种子网格的个数m需要认为指定,全凭个人经验,很多情况下,也需要不断地尝试,最后得到的类簇个数才能接近预期。针对不同类型的数据分布,可以采用不同种子网格的选取方案,但是某些情况下三种方式都不一定能够得到最优的选取。
- 综合上面的优缺点,总的说来,这个算法在性能上有好的表现,可以用来处理大规模的数据,同时,也需要不断地尝试不同的参数组从而获得最优解。