1、随机生成三个簇点:
> c1<-cbind(rnorm(30,2,1),rnorm(30,2,1))
> c2<-cbind(rnorm(30,3,1),rnorm(30,20,1))
> c3<-cbind(rnorm(30,15,1),rnorm(30,25,1))
> v=rbind(c1,c2,c3)
查看分布情况
> plot(v)
图 1 产生的随机数据
2、K聚类
像PAM这样的K-中心点算法(常见的K-means,K-medois等等)在小型数据集上运行良好,但是不能很好的用于大数据集运行。为了处理大数据集,通常使用一种称作CLARA(Cluster Large Application)的基于抽样的方法。CLARA并不考虑整个数据集合,而是使用数据集的一个随机样本,然后使用PAM方法由样本计算最佳中心点。
本次实验主要用的是cluster包里面的clara函数。
> clara(v,3)
Call: clara(x = v, k = 3)
Medoids:
[,1] [,2]
[1,] 2.067384 1.761579
[2,] 3.037691 20.208036
[3,] 15.310366 25.211417
Objective function: 1.236222
Clustering vector: int [1:90] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...
Cluster sizes: 30 30 30
Best sample:
[1] 2 4 5 6 7 11 12 13 23 24 25 26 27 29 32 34 37 41 42 43 44 45 47 49 51 52 53 54 57
[30] 59 60 61 62 63 64 65 67 74 75 77 81 82 83 84 85 89
Available components:
[1] "sample" "medoids" "i.med" "clustering" "objective" "clusinfo"
[7] "diss" "call" "silinfo" "data"
显示结果:
> cls3<-clara(v,3)
> clusplot(cls3)
图 2 分类数K取3的结果
K-means一个缺陷就是需要人为指定聚类数目K,如果k值指定的不好,聚类的效果也不是很好。
图 3 分类数K分别去2,3,4,5的结果
3、层次聚类
层次聚类方法将数据对象组成层次结构或者簇的“树”,主要分为凝聚和分裂两类层次分析方法,跟别使用自底向上和自顶向下的策略把对象组织到层次结构中。
分裂方法一个很大的问题是如何把一个大簇分成几个较小的簇。N个对象的集合可以划分成两个互斥的2n-1-1种方法,当n很大是,计算量是非常大的,因此分裂方法通常采用启发式方法进行划分,但是导致结果不准确,而且为了效率,分裂方法不对已经做出的划分决策回溯。由于这些原因,凝聚方法一般比分裂方法用的多。
3.1凝聚层次聚类(agglomerative hierarchical clustering)
本次实验中采用的cluster包中的AGNES(Agglomerative Nesting)层次聚类算法。
agnSingle<-agnes(daisy(v),diss=TRUE,method="single")
> agnComplete<-agnes(daisy(v),diss=TRUE,method="complete")
> agnAverage<-agnes(daisy(v),diss=TRUE,method="average")
> plot(agnSingle)
Hit <Return> to see next plot:
Hit <Return> to see next plot:
> plot(agnComplete)
Hit <Return> to see next plot:
Hit <Return> to see next plot:
> plot(agnAverage)
Hit <Return> to see next plot:
Hit <Return> to see next plot:
图 4簇之间相似度采用最小值的聚类结果树状图
图 5簇之间相似度采用最大值的聚类结果树状图
图 6 簇之间相似度采用平均值的聚类结果树状图
3.2分裂层次聚类(divisive hierarchical clustering)
本次实验中采用的是cluster包中的DIANA(Divisive Analysis)层次聚类算法。
> dv<-diana(v)
> plot(dv)
图 7 分裂层次聚类结果树状图