K均值聚类算法的最大的优点是:原理简单,实现起来也相对简单,同时执行效率和对于大数据量的可伸缩性还是较强的。然而缺点也是很明确的,首先它需要用户在执行聚类之前就有明确的聚类个数K的设置,这一点是用户在处理大部分问题时都不太可能事先知道的,一般需要通过多次试验找出一个最优的K值;其次就是,由于算法在最开始采用随机选择初始聚类中心的方法,所以算法对噪音和孤立点的容忍能力较差。所谓噪音就是待聚类对象中错误的数据,而孤立点是指与其他数据距离较远,相似性较低的数据。对于K均值算法,一旦孤立点和噪音在最开始被选作簇中心,对后面整个聚类过程将带来很大的问题,那么我们有什么方法可以先快速找出应该选择多少个簇,同时找到簇的中心,这样可 以大大优化K均值聚类算法的效率,下面就介绍另一个聚类方法:Canopy聚类算法。
Canopy聚类算法是一个将对象分组到类的简单、快速、精确地方法。每个对象用多维特征空间里的一个点来表示。这个算法使用一个快速近似距离度量和两 个距离阈值 T1>T2来处理。基本的算法是,从一个点集合开始并且随机删除一个,创建一个包含这个店的Canopy,并在剩余的点集合上迭代。对于每个点,如果它的距离第一个点的距离小于T1,然后这个点就加入这个聚集中。除此之外,如果这个距离<T2,然后将这个点从这个集合中删除。这样非常靠近原点的点将避免所有的未来处理。这个算法循环到初始集合为空为止,聚集一个集合的Canopies,每个可以包含一个或者多个点。每个点可以包含在多于一个的Canopy中。
Canopy聚类经常被用作更加严格的聚类技术的初始步骤,像是K均值聚类。通过一个初始聚类,可以将更加耗费的距离度量的数量通过忽略初始canopies的点显著减少。
Canopy聚类算法经常用于K均值聚类算法的预处理,用来找合适的k值和簇中心。
K均值的最大问题是要求用户必须事先给出k的个数,k的选择一般都基于一些经验值和多次实验结果,对于不同的数据集, k的取值没有可借鉴性。另外,
K均值对“噪音”和孤立点数据是敏感的,少量这类的数据就能对平均值造成极大的影响。
虽然Canopy聚类算法的引用有效的解决了初始选K的个数这一问题,可以看到在 org.apache.mahout.clustering.syntheticcontrol.kmeans.job中是先调用了 CanopyDriver.run方法来进行初始选K及中心点,然后再调
KMeansDriver.run方法进行Kmeans聚类。
可是引进Canopy算法后,会带来新的问题,对于Canopy算法来说,阈值T1和
T2的选择又是一大问题,网上也查不到相关资料,直是让人头痛...
Canopy聚类是一种简单、快速、但不太准确的聚类方法。该算法需一种快速的近似距离度量方法和两个距离阈值T1>T2。
while(没有标记的数据点){
选择一个没有强标记的数据点p
把p看作一个新Canopyc的中心
离p距离<T1的所有点都认为在c中,给这些点做上弱标记 离p距离<T2的所有点都认为在c中,给这些点做上强标记}
Canopy聚类常作为更强聚类方法的初始步骤。
mahoutCanopy 聚类实现,采用了两个map-reducejob
第一个Joborg.apache.mahout.clustering.canopy.CanopyDriver:
mapper:org.apache.mahout.clustering.canopy.CanopyMapper
对划分到每个mapper的点根据阈值T1,T2标记Canopy,输出在该mapper上所有 Canopy的中心;
mahout实现对原算法略做改动,而避免需先保存所有的点
修改后的算法org.apache.mahout.clustering.canopy.addPointToCanopies对于一个数据点,遍历已有Canopy{
该点到某Canopy距离<T1,则加入该Canopy;
若点到某Canopy距离<T2,则标记该点已于该Canopy强关联;
}
若该点不存在强关联的Canopy,则为其创建一个新Canopy
reducer:org.apache.mahout.clustering.canopy.CanopyReducer整个Job就一个reduce任务,对mapper输出的所有点再次使用Canopy聚类,并输出中心点第二个 Joborg.apache.mahout.clustering.canopy.ClusterDriver使用第一个Job输出的中心点,采用最近距离原则对原数据点进行聚类用Canopy聚类作为其他方法的初始步骤时,通常不执行该Job
参数调整:
当T1过大时,会使许多点属于多个Canopy,可能会造成各个簇的中心点间距离较近,各簇
间区别不明显;
当T2过大时,增加强标记数据点的数量,会减少簇个个数;T2过小,会增加簇的个数,同时
增加计算时间
另外:mahout提供了几种常见距离计算的实现,均实现
org.apache.mahout.common.distance.DistanceMeasure接口
CosineDistanceMeasure:计算两向量间的夹角
SquaredEuclideanDistanceMeasure:计算欧式距离的平方EuclideanDis
tanceMeasure:计算欧式距离
Manhatt anDis tanceMeasure :马氏距离,貌似图像处理中用得比较多TanimotoDistanceMeasure:Jaccard相似度,T(a,b) = a.b / (|a「2+ |b「2- a.b)
以及带权重的欧式距离和马氏距离。
需要注意:
1.首先是轻量距离量度的选择,是选择数据模型其中的一个属性,还是其它外部属性这对canopy的分布最为重要。
2.Tl, T2的取值影响到canopy重叠率f,以及canopy的粒度。
3.Canopy有消除孤立点的作用,而K-means在这方面却无能为力。建立canopies之后,可以删除那些包含数据点数目较少的canopy,往往这些canopy是包含孤立点的。
4.根据canopy内点的数目,来决定聚类中心数目k,这样效果比较好
因篇幅问题不能全部显示,请点此查看更多更全内容