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 分裂層次聚類結果樹狀圖