聚类是信息检索、数据挖掘中的一类重要技术,是分析数据并从中发现有用信息的一种有效手段。它将数据对象分组成为多个类或簇,使得在同一个簇中的对象之间具有较高的相似度,而不同簇中的对象差别很大。作为统计学的一个分支和一种无监督的学习方法,聚类从数学分析的角度提供了一种准确、细致的分析工具。而k-means算法是最常用和最典型的聚类算法之一,k-means算法是典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。k-means的优点在于能快速的收敛及易于实现,但是该算法在一些数据量非常大的应用中表现出的性能是比较差的,因此,本文在研究了k-means算法的基础上,提出了利用GPU(Graphic Processing Unit)的并行计算能力来优化k-means算法的方案。

  一、聚类分析及k-means算法

  1. 聚类分析技术

  对于给定的数据集,按照一定的度量,把其中相似度大的归为一类,这样的过程称为聚类(Clustering)。聚类分析的结果是一个个的数据或对象的集合,称之为簇(Cluster):同一个簇中的对象相似,而与其他簇中的对象则不相似。现在主流的聚类分析技术一般可以分为以下几类:

  ①基于划分的方法。对于给定的n个对象,提供数值k(k≤N),将对象划分为k份,每一份满足“簇”的定义。典型的基于划分的算法有K-Means算法和K-Medoids算法。划分方法需要在运算之前就确定K的值。

  ②基于层次的方法。层次方法创建给定数据对象集的层次分解。层次方法可分为:凝聚法,开始时每个对象为一类,合并相似项,直至所有对象被合并为一个类;分裂法,开始时将所有对象都归类为一个类,逐次将每个类分裂为更小的类,直至所有对象的类满足“簇”的概念,或满足其他既定的收敛条件。典型的基于层次的算法有:BIRCH算法、ROCK(RObust Clusteringusing linKs)算法和Chameleon算法。

  ③基于密度的方法。基于距离的聚类算法更容易发现球形簇,但对于发现任意形状的簇,则力不从心。基于密度的方法能解决这个问题:对于数据集中的每一个点,在给定的半径邻域内,假设包含M个点,如果M满足既定的条件,则算法继续。常用的基于密度的方法有:DBSCAN(Density-Based Spatial Clustering of Applications with Noise)、DENCLUE(DENsity-based CLUstEring)和OPTICS(Ordering Points to Identify the Clustering Structure)。

  ④基于网格的方法[1]。该方法将对象空间划分为一定数量的单元,组成网格,并在此基础上进行聚类。典型的例子有:STING(Statistical Information Grid)、WaveCluster。

  2. K-Means算法

  在众多基于划分方法的聚类算法中,K-Means算法是最著名和最常用的算法之一。K-Means算法以k为输入参数,将给定的n个对象,划分为k个簇,使得簇内的对象相似度高,而不同簇内的对象的相似度低。

  K-Means 算法的主要流程如下:

  ①在给定的n个对象中,随机选取k个对象,作为每一个簇的初始均值(中心);

  ②对于其余的n-k个对象,分别计算与k个中心的距离,将对象指派到最接近的簇;

  ③更新每个簇的新均值,得出k个新的中心;

  ④根据k个新的中心,重复(2)(3)两个步骤,直至准则函数收敛。

  虽然K-Means算法实现起来比较简单,但K-Means算法也存在以下问题:

  ①需要对全部N个数据进行多次遍历,假设为 M 次;每次遍历中,对每个数据都需要进行 k 次比较运算,则计算复杂度为O(N*M*k),同时还需要反复读取原数据,并将比较结果多次写到存放分类信息的结果集中。虽然通常情况下,M<

  ②K的大小需要在算法前确定,并且一般需要用户指定。这就需要依靠用户的经验,在运算前就明确,或大概明确现有的数据有多少个分类;

  ③对于异常点、离群点较敏感,一个异常点就可能影响整个算法的结果;

  ④初始簇中心的选取可能会对整个聚类结果产生很大的影响,甚至能产生截然不同的聚类结果。

  因此,不少学者针对以上问题从不同方面提出了一些优化的方案[2]。例如,文献3中提出了一种使用K-D Tree来加速算法的执行时间的方案[3]。另一种方案是将K-Means算法中的计算部分高度并行化,文献4中提出利用OpenMP来优化K-Means算法[4]。但这种方法不可避免地会产生大量的多线程通信代价。

  目前,大多数桌面计算机都配置了可编程的图形处理器(GPU,Graphic Processing Unit)。GPU是一种单指令流多数据流(SIMD)计算模式的处理器,在处理单元的数量上要远远超过CPU ,拥有数十个甚至上百个处理核心。尽管GPU的运行频率低于CPU,但更多的执行单元数量能够使GPU在浮点运算能力上获得大幅优势,同时期主流的GPU性能可以达到CPU性能的10倍左右。近年来,GPU性能的飞速发展,加上基于GPU的可编程性越来越简单,使得基于GPU并行计算来优化K-Means算法成为可行。

  本文提出了一种基于GPU并行计算的K-Means算法的优化方案,将传统K-Means算法中计算密集部分采用并行化的方法在GPU上计算。下文将详细介绍GPU并行计算的相关原理及基于GPU并行计算的K-Means算法。