本文主要介绍weka的cluster工具集中的Canopy算法,包括算法原理、算法的应用场景以及算法对输入数据的要求等内容。
文章目录
-
-
- 算法简介
- 算法原理
-
-
- 1.一图知大意
- 2.算法流程
- 3.算法伪代码
- 4.Python利用hadoop实现Canopy算法
-
- 应用场景
- 对数据的要求
- weka使用方法
- 参考文献
-
算法简介
Canopy算法是一种比较经典的聚类算法,可称为
粗聚类
,它的输出并不是最重要的结果,而是为其他精确算法服务的。它
不需要事先确定如k-means方法所需的聚类中心个数,并可以粗略地估计出聚类中心的个数之后再采用k-means算法
,能有效降低k-means等精确聚类算法的计算复杂度。
当前Canopy算法在mahout大数据机器学习工具中应用较多,能与hadoop结合产生非常好的计算效果。(其
近似计算以降低算力需求
的思想非常适合大数据分析算法。)
算法原理
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之间的距离 < T 1 <T_1 <T1,则将 d i d_i di加入canopy c c c的集合;(*1)
如果 d i d_i di与 c c c之间的距离 < T 2 <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的值通过交叉检验确定,如下图。代码参考:Canopy聚类算法分析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中心
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)属性。
当不是数值属性时,可计算实例之间的相似性来表示实例之间的距离。比如汉明距离、余弦相似度等 interface栏用于修改源码时了解其继承关系。additional栏表示该算法的附加约束是“某类别的最小实例数目”必须大于0。
weka使用方法
- 参数介绍
比较重要的有如下参数:
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算法已经包括了调优等内容,比较完善了。剪枝参数等与决策树中的调优类似。
- 使用示例
-
导入数据
选择weka中/data目录下自带的示例数据集iris.arff数据集,并移除class属性(聚类属于无监督学习,不需要标签)。
-
设置算法参数
此处选择Cluster菜单下的Canopy算法,由下图可以看出:
(1)minimumCanopyDensity参数设置为负数、periodPruningRate设置一个较大的值,表示并未采用剪枝等tuning策略;
(2)maxCandidateCanopiesToHoldInMemory参数设置为100,基本跟没设置一样,因为一般的Canopies达不到这个数目,这个参数是为特殊情况下终止算法而设置的。
-
选择训练-测试方法
这里采用80%的数据作为训练集,20%的数据用于测试。
- 结果分析
-
标记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%数据进行分类所得到的分类结果。
-
总结:从结果输出来看,采用默认参数而不设置调优参数会导致最终结果误差较大。Canopy聚类算法确实可以为精确聚类所需的聚类中心数目提供参考(如在全部训练集上训练模型时得出found=3,即可以此作为其他精确聚类算法的初始参数)。
参考文献
Canopy聚类算法(经典,看图就明白)
Parallel Machine Learning for Hadoop/Mapreduce – A Python Example