KMean聚类算法是一种比较简单而且常用的聚类算法,该算法有以下特点:
a) 聚类数目的一定的
b)选择一个样本的最近聚类时,需要将所有聚类的距离都计算一遍,然后选择最近的聚类作为该样本所属的类别
考虑到以上特点,会存在以下问题:首先,如果对数据样本集合不了解,K的选择会有一定的随机性,K的选择关乎聚类质量和计算效率,其次,与所有聚类集合都进行计算,这个效率会非常低下。综合以上两点,常见的改进的方法是层次聚类或者基于Tree的方法来减少计算量等方法,在项目的过程中,调研了Fast Streaming kmeans的方法,该算法有以下特点:
a)是基于streaming的,所以样本可以无限大,而且对数据样本只计算一次
b)最终聚类产生的结果集合的大小k是在一定范围变化的
c)在聚类过程中,只有当满足一定概率的时候才会产生新的聚类;当聚类数据大于上限,对聚类进行合并操作
Fast Streaming kmeans算法适合处理较大规模的数据,但是还是有一定的局限性,比如计算效率会随着聚类数据增大而下降,聚类的精度较低,在60W集合的聚类时间1个多小时,不符合我们的需求,在考虑了kmean的计算特点和实际应用场景之后,我们对kmeans算法做了以下改进:
a)将样本数据进行稀疏存储,构建节点的索引
b)计算样本的所属聚类的时候,只与该样本拥有共同索引的聚类计算距离
c)在计算距离的时候,随机从聚类集合中选取一个作为基准进行计算
以上改进使得聚类在60W集合的时间在20分钟左右,考虑到c)中随机选择基准的不确定性,在计算距离的时候,利用索引,找出与样本共现次数最多的一个样本进行计算。最后再针对代码进行了调整和改进,使得在原有数据集合的聚类时间在6分钟左右,基本能达到我们在线系统的运行需求。