CURE聚类算法的实现.docx
《CURE聚类算法的实现.docx》由会员分享,可在线阅读,更多相关《CURE聚类算法的实现.docx(7页珍藏版)》请在冰豆网上搜索。
CURE聚类算法的实现
CURE聚类算法的实现
任务背景
聚类(clustering)就是将数据对象分组成为多个类或簇(cluster),在同一簇中的对象之间具有较高的相似度,而不同的簇中对象差别较大。
相异度是根据描述对象的属性值来计算的。
距离是经常采用的度量方式。
聚类分析源于许多研究领域,包括数据挖掘,统计学,生物学,以及机器学习。
作为统计学的一个分支,聚类分析已经被广泛的研究了许多年,主要集中在基于距离的聚类分析。
基于k-means(k-平均值),k-medoids(k-中心点)和其他一些方法的聚类分析工具已经被加入到许多统计分析软件包或系统中,例如S-Plus,SPSS,以及SAS。
CURE(ClusteringUsingRepresentatives)是一种针对大型数据库的高效的聚类算法。
基于划分的传统的聚类算法得到的是球状的,相等大小的聚类,对异常数据比较脆弱。
CURE采用了用多个点代表一个簇的方法,可以较好的处理以上问题。
并且在处理大数据量的时候采用了随机取样,分区的方法,来提高其效率,使得其可以高效的处理大量数据。
基本目标
聚类算法CURE的算法实现。
对图形进行聚类,在时间,结果方面对其性能进行评估。
算法流程
CURE的算法在开始时,每个点都是一个簇,然后将距离最近的簇结合,一直到簇的个数为要求的K。
它是一种分裂的层次聚类。
算法分为以下6步:
1)从源数据对象中抽取一个随机样本S。
2)将样本S分割为一组划分。
3)对划分局部的聚类。
4)通过随机取样提出孤立点。
如果一个簇增长得太慢,就去掉它。
5)对局部的簇进行聚类。
6)用相应的簇标签标记数据。
算法设计
(1)基本聚类算法
procedurecluster(S,k) /*将数据集S聚类成为k个簇*/
begin
1. T:
=build_kd_tree(S) /*对应数据集S建立一个K-DTreeT*/
2. Q:
=build_heap(S) /*对应数据集S建立一个堆Q*/
3. whilesize(Q)>kdo{ /*聚类直至簇的个数为k*/
4. u:
=extract_min(Q) /*找到最近的两个簇u,v*/
5. v:
=u.cloest
6. delete(Q,v)
7. w:
=merge(u,v) /*将u,v合并为簇w*/
8. delete_rep(T,u);delete_rep(T,v);insert_rep(T,w)
9. w.cloest:
=x /*xisanarbitraryclusterinQ*/
10. foreachx∈Qdo{/*调节因合并带来的T和Q的变化*/
11. if(dist(w,x)12. w.cloest:
=x
13. ifx.cloestiseitheruorv{
14. ifdist(x,x.cloest)15. x.cloest:
=cloest_cluster(T,x,dist(x,w))
16. else
17. x.cloest:
=w
18. relocate(Q,x)
19. }
20. elseifdist(x,x.cloest)>dist(x,w){
21. x.cloest:
=w
22. relocate(Q,x)
23. }
24. }
25. insert(Q,w)
26. }
end
此程序段用到的数据结构有Heap,和K-DTree。
为了合并距离最短的两个聚类,需要构建一个K-DTree来找到空间中的一聚类最近的一个聚类,之后把K-DTree中的聚类按照其与最近的聚类的距离进行排序(用的是堆排序),找到最近的两个的聚类,将它们合并(对应函数merge())。
(2)Merge算法
proceduremerge(u,v) /*合并两个簇,并确定新簇的中心点和代表点*/
begin
1. w:
=u∪v
2. w.mean:
=
/*求新簇w的中心点*/
3. tmpSet:
=Ø /*用来存c个代表点的集合*/
4. fori:
=1tocdo{ /*选出c个代表点*/
5. maxDist:
=0 /*距中心点或代表点最远的点作为代表点*/
6. foreachpointpinclusterwdo{
7. ifi=1
8. minDist:
=dist(p,w.mean)
9. else
10. minDist:
=min{dist(p,q):
q∈tmpSet}
11. if(minDist>=maxDist){
12. maxDist:
=minDist
13. maxPoint:
=p
14. }
15. }
16. tmpSet:
=tmpSet∪{maxPoint}
17. }
18. foreachpointpintmpSetdo /*按照收缩因子α处理代表点*/
19. w.rep:
=w.rep∪{p+α*(w.mean–p)}
20. returnw
end
此程序段同时描述了如何选取代表点:
对每个簇选择c个分布较好的点,通过系数α向中心收缩,其中0<α<1。
α小,收缩小,可以区分拉长的簇;α大,靠近中心点,得到的簇更紧凑。
显然,如果α=1,聚类w的代表点就是w.mean,即其中心点,此时类似于Centroid-baseapproach,即中心点代表簇,当α=0,此时类似于All-pointsapproach,即所有点代表簇。
簇之间的距离定义为:
两个簇的代表点之间的最小距离,即:
点到簇的距离与此类似,是该点到最近的簇的代表点的距离。
c个代表点体现了簇的物理几何形状;向中心收缩可以降低异常点的影响。
两个簇组合后的新簇,则重新选择c个点作为簇的代表。
(3)数据取样:
在对大规模数据库进行聚类分析时,数据取样是一种常用的提高聚类效率的方法,即对整个数据库进行数据取样,然后对取样数据库进行聚类分析,而对未被取样的数据进行聚类标注。
这样,对大规模数据库的聚类分析就转化为对较小规模的取样数据库的聚类分析。
由于没有考虑到整个数据库的数据,聚类质量必然会受到影响。
但是,只要取样均匀且取样率适当,则取样数据库也可以较好地反映整个数据库状况,从而在保证聚类质量的同时提高聚类效率。
定理1:
对一个簇u,如果取样大小s满足:
那么,样本中属于簇u的点的个数小于f|u|的概率小于δ,0<=δ<=1
因此,采用chernoffbounds来确定的最小的取样数据量:
这就表示着如果我们只关心数据点数目大于的聚类,且最小的聚类至少有ξ个数据点,那么我们只需要一个独立于原始数据点个数的取样数目。
(4)分区方法
分区过程如下:
将所有样本分成p个分区,每个分区大小n/p。
每个分区内作聚类,直到分区内的簇的个数为n/pq,q>1。
或者指定一个距离阈值,当最近簇距离大于阈值,则停止。
在CURE算法中,
Firstpass每个分区:
Secondpass总聚类:
p,q的最好选值:
使n/pq为k的2~3倍。
其优点是:
减少执行时间;减少输入数据,保证可以在内存中存放所有聚类的代表点。
(5)标记数据所属的簇
因为CURE用c个点来代表一个聚类,因此在聚类完成后,对未参加聚类的数据或新增的数据进行标注从而计算聚类的可信度时,其可以准确的识别非球状数据集,使得标注更加准确。
(6)异常点的处理
1.随机取样,过滤了大多数的异常点;
2.异常点所在的簇的点个数少于正常簇的点的个数,此时分两个阶段消除异常点。
a.第一阶段:
增长速度慢的簇作为异常,以点的个数作为阈值。
Fraction(簇的个数为初始簇个数的比例;比如:
1/3)的取值很重要;当簇的个数减少到fraction时,开始作消除异常点的操作。
b.第二阶段:
在第一阶段中,可能有些相近的异常点已经组合,所以进行第二阶段中异常点形成的簇非常小,很容易鉴别。
数据取样算法:
在对大规模数据库进行聚类分析时,数据取样是一种常用的提高聚类效率的方法,即对整个数据库进行数据取样,然后对取样数据库进行聚类分析,而对未被取样的数据进行聚类标注。
这样,对大规模数据库的聚类分析就转化为对较小规模的取样数据库的聚类分析。
由于没有考虑到整个数据库的数据,聚类质量必然会受到影响。
但是,只要取样均匀且取样率适当,则取样数据库也可以较好地反映整个数据库状况,从而在保证聚类质量的同时提高聚类效率。
与以前的基于取样的聚类算法相比。
取样算法:
这种算法只需扫描一遍被取样数据库,而且使用恒定的内存空间,便可以从N个记录中随机取出n个取样记录。
其基本思想是:
从第N-n+1条记录开始,做下列操作。
设当前处理的是第t个记录(n+1≤t≤N),u是产生的一个随机数(u∈〔0,t-1〕),若u可以证明该算法能够得到均匀的取样结果。
确定取样率很重要。
为保证聚类质量,取样数据库应该能够有效地代表原数据库。
若取样率太低,取样数据库必然会丢失原数据库的某些特质,导致聚类效果失真。
测试方法:
对图形(事实上相当于2维的数据库数据)进行聚类。
输入:
左图
输出:
类似右图,即把两组点分开,可以用颜色的不同来表示
一个图形约有几万个点,取样数目在k*500至k*1000(k为分组的数目),左右,可以自己掌握。
(注:
专业文档是经验性极强的领域,无法思考和涵盖全面,素材和资料部分来自网络,供参考。
可复制、编制,期待你的好评与关注)