天天看点

weka算法系列(cluster)——Canopy(1)

本文主要介绍weka的cluster工具集中的Canopy算法,包括算法原理、算法的应用场景以及算法对输入数据的要求等内容。

文章目录

      • 算法简介
      • 算法原理
          • 1.一图知大意
          • 2.算法流程
          • 3.算法伪代码
          • 4.Python利用hadoop实现Canopy算法
      • 应用场景
      • 对数据的要求
      • weka使用方法
      • 参考文献

算法简介

  Canopy算法是一种比较经典的聚类算法,可称为

粗聚类

,它的输出并不是最重要的结果,而是为其他精确算法服务的。它

不需要事先确定如k-means方法所需的聚类中心个数,并可以粗略地估计出聚类中心的个数之后再采用k-means算法

,能有效降低k-means等精确聚类算法的计算复杂度。

  当前Canopy算法在mahout大数据机器学习工具中应用较多,能与hadoop结合产生非常好的计算效果。(其

近似计算以降低算力需求

的思想非常适合大数据分析算法。)

算法原理

1.一图知大意
weka算法系列(cluster)——Canopy(1)

图片来源:http://picksesame.blogspot.com/2011/05/canopy-clustering.html

  如上图,Canopy算法有两个阈值T1和T2,算法的核心就是对大于T1、大于T2且小于T1、小于T2三种阈值范围内的instance(实例点)采用不同的处理方式。具体算法流程见下一节。

2.算法流程

当实例集 D D D非空时:

  从 D D D中选择元素 d d d作为canopy c c c;

  从 D D D中移除元素 d d d;

  对 D D D中除元素 d d d以外的其它元素进行遍历:

    如果 d i d_i di​与 c c c之间的距离 &lt; T 1 &lt;T_1 <T1​,则将 d i d_i di​加入canopy c c c的集合;(*1)

    如果 d i d_i di​与 c c c之间的距离 &lt; T 2 &lt;T_2 <T2​,则从 D D D中移除当前元素 d i d_i di​;(*2)

  结束遍历。

  将当前的canopy c c c对应的集合存储到列表 C C C中;

算法结束。

1.关键之处在于(*1)和(*2)两个步骤。参照上一节中的示意图可知,这种处理方式相当于设置了一个

距离的缓冲区

,即处于 T 1 T_1 T1​和 T 2 T_2 T2​之间的这部分实例在每一次聚类中并不是严格的属于该类,还要参与下一次聚类;只有当小于 T 2 T_2 T2​(严格属于该类)时,才从 D D D中删除,不参与下一次聚类。这样的处理方式更稳妥。
2. T 1 T_1 T1​和 T 2 T_2 T2​的值通过交叉检验确定,如下图。
from Old_regression import crossValidation
#使用K均值
import kMeans as km
def canopyClustering(datalist):
   state =[];
   #交叉验证获取T1和T2;
   T1,T2 = crossValidation(datalist);
   #canopy 预聚类
   canopybins= canopy(datalist, T1 , T2);
   #使用K均值聚类
   k =len(canopybins);
   createCent = [canopy[0] for canopy in canopybins];#获取canopybins中心
           
代码参考:Canopy聚类算法分析
3.要注意,最终聚类得到的各个类别中,并不会存在交叉重叠,因为只要 D D D中存在实例元素时,聚类算法就不会停止,算法会循环直至每个元素都严格属于各自的聚类。参考文献1中关于这一点的分析时不正确的,要注意!
3.算法伪代码
while D is not empty
      select element d from D to initialize canopy c
      remove d from D
      Loop through remaining elements in D:
           if distance between d_i and c < T1 : add element to the canopy c
           if distance between d_i and c < T2 : remove element from D
      end
      add canopy c to the list of canopies C
end
           
4.Python利用hadoop实现Canopy算法

  参考文献2中基于Python与hadoop的mapreduce实现了Canopy算法的并行计算,在后续文章中逐一进行解读。

应用场景

  主要用于正式聚类之前的粗聚类,确定大致的分类数目。这种思想尤其适用于大数据分析领域。

对数据的要求

  下图是Canopy算法的能力描述,可以看出:数据集的属性可以是binary二进制属性(如flag值为0或1)、空标签属性、缺失值、标签属性、数值属性以及一元(unary)属性。

当不是数值属性时,可计算实例之间的相似性来表示实例之间的距离。比如汉明距离、余弦相似度等
weka算法系列(cluster)——Canopy(1)
  interface栏用于修改源码时了解其继承关系。additional栏表示该算法的附加约束是“某类别的最小实例数目”必须大于0。

weka使用方法

  1. 参数介绍
    weka算法系列(cluster)——Canopy(1)

比较重要的有如下参数:

t 2 t_2 t2​:对应算法中的阈值下限 t 2 t_2 t2​,如果<0表示在批训练时基于属性值进行启发式设置(如交叉验证寻找最佳 t 2 t_2 t2​)。

t 1 t_1 t1​:对应算法中的阈值下限 t 1 t_1 t1​,如果<0则被视为 t 2 t_2 t2​乘以一个正的常数(即如果 t 1 = − 0.25 t_1=-0.25 t1​=−0.25,则 t 1 = t 2 ∗ 0.25 t_1=t_2*0.25 t1​=t2​∗0.25)。

n u m C l u s t e r s numClusters numClusters:设置类别个数,如果为-1表示根据 t 2 t_2 t2​的距离决定合适的聚类数目。

m i n i m u m C a n o p y D e n s i t y minimumCanopyDensity minimumCanopyDensity:用于算法优化的参数。当某个canopy中 t 2 t_2 t2​距离内的实例数目小于该参数时,将该canopy进行剪枝。

p e r i o d P r u n i n g R a t e periodPruningRate periodPruningRate:用于算法优化的参数。表示训练模型时以多大频率对低于最低密度的聚类进行剪枝。

其实weka中囊括的Canopy算法已经包括了调优等内容,比较完善了。剪枝参数等与决策树中的调优类似。
  1. 使用示例
  • 导入数据

      选择weka中/data目录下自带的示例数据集iris.arff数据集,并移除class属性(聚类属于无监督学习,不需要标签)。

    weka算法系列(cluster)——Canopy(1)
  • 设置算法参数

      此处选择Cluster菜单下的Canopy算法,由下图可以看出:

    (1)minimumCanopyDensity参数设置为负数、periodPruningRate设置一个较大的值,表示并未采用剪枝等tuning策略;

    (2)maxCandidateCanopiesToHoldInMemory参数设置为100,基本跟没设置一样,因为一般的Canopies达不到这个数目,这个参数是为特殊情况下终止算法而设置的。

    weka算法系列(cluster)——Canopy(1)
  • 选择训练-测试方法

      这里采用80%的数据作为训练集,20%的数据用于测试。

    weka算法系列(cluster)——Canopy(1)
  • 结果分析
    • 标记1、2、3是模型在整个训练集上的训练结果:

      (1)标记1的 t 1 t_1 t1​和 t 2 t_2 t2​是训练集两个最终阈值

      (2)标记2表示最终Canopies的数目是3,这和鸢尾花数据集中三类花是相符合的

      (3)标记3分别展示了三种类别对应的实例数目,可知cluster0、cluster1和cluster2对应的实例数分别为91、46、13。由于原数据集各标签数目均为50,所以此处结果还是比较粗糙的,不过canopy的数目是正确的,正好可以用于k-means等精确聚类算法。

    • 标记4、5、6是在测试集上的输出结果:

      (4)由于只用80%数据训练模型,导致Canopies的数目为2,与在全部训练集上训练模型的数目(3个)不同。

      (5)标记7表示用80%数据所训练的模型参数对剩余20%数据进行分类所得到的分类结果。

      weka算法系列(cluster)——Canopy(1)
总结:从结果输出来看,采用默认参数而不设置调优参数会导致最终结果误差较大。Canopy聚类算法确实可以为精确聚类所需的聚类中心数目提供参考(如在全部训练集上训练模型时得出found=3,即可以此作为其他精确聚类算法的初始参数)。

参考文献

Canopy聚类算法(经典,看图就明白)

Parallel Machine Learning for Hadoop/Mapreduce – A Python Example

继续阅读