天天看點

R語言使用層次聚類處理資料

凝聚層次聚類說明

層次聚類可以分成凝聚(agglomerative,自底向上)和分裂(divisive,自頂向下)兩種方法來建構聚類層次,但不管采用那種算法,算法都需要距離的相似性度量來判斷對資料究竟是采取合并還是分裂處理。

凝聚層次聚類操作

采用層次聚類,将客戶資料集分成不同的組,從github上下載下傳資料:

https://github.com/ywchiu/ml_R_cookbook/tree/master/CH9下載下傳

customer.csv檔案

customer = read.csv("d:/R-TT/example/customer.csv")
head(customer,)
   ID Visit.Time Average.Expense Sex Age
                               
                              
                             
                              
                             
                              
                             
                             
                              
                             
           

檢查資料集結構:

str(customer)
'data.frame':    obs. of   variables:
 $ ID             : int            ...
 $ Visit.Time     : int            ...
 $ Average.Expense: num            ...
 $ Sex            : int            ...
 $ Age            : int            ...
           

對客戶資料進行歸一化處理:

資料标準化(歸一化)處理是資料挖掘的一項基礎工作,不同評價名額往往具有不同的量綱和量綱機關,這樣的情況會影響到資料分析的結果,為了消除名額之間的量綱影響,需要進行資料标準化處理,以解決資料名額之間的可比性。原始資料經過資料标準化處理後,各名額處于同一數量級,适合進行綜合對比評價。以下是兩種常用的歸一化方法:

一、min-max标準化(Min-Max Normalization)

也稱為離差标準化,是對原始資料的線性變換,使結果值映射到[0 - 1]之間。轉換函數如下:

R語言使用層次聚類處理資料

其中max為樣本資料的最大值,min為樣本資料的最小值。這種方法有個缺陷就是當有新資料加入時,可能導緻max和min的變化,需要重新定義。

二、Z-score标準化方法

這種方法給予原始資料的均值(mean)和标準差(standard deviation)進行資料的标準化。經過處理的資料符合标準正态分布,即均值為0,标準差為1,轉化函數為:

R語言使用層次聚類處理資料

其中為所有樣本資料的均值,為所有樣本資料的标準差。

此處采用方法二

customer = scale(customer[,-])
customer
       Visit.Time Average.Expense        Sex         Age
 [,] -     - - -
 [,] -     - -  
 [,]         -  
 [,] -     - -  
 [,]         -  
 [,] -     - - -
 [,]         -  
 [,]         -  
 [,] -       - -
[,] -     - - -
           

使用自底向上的聚類方法處理資料集:

hc = hclust(dist(customer,method = "euclidean"),method = "ward.D2")
> hc

Call:
hclust(d = dist(customer, method = "euclidean"), method = "ward.D2")

Cluster method   : ward.D2 
Distance         : euclidean 
Number of objects:  
           

最後,調用plot函數繪制聚類樹圖

R語言使用層次聚類處理資料

使用離差平方和繪制聚類樹圖

還可以使用最短距離法(single)來生成層次聚類并比較以下兩者生成的聚類樹圖的差異:

hc2 = hclust(dist(customer),method = "single")
plot(hc2,hang = -0.01,cex = 0.7)

           
R語言使用層次聚類處理資料

使用最短距離法繪制聚類樹圖

凝聚層次聚類原理

層次聚類是一種通過疊代來嘗試建立層次聚類的方法,通常可以采用以下兩種方式完成:

凝聚層次聚類

這是一個自底向上的聚類方法。算法開始時,每個觀測樣例都被劃分到單獨的簇中,算法計算得出每個簇之間的相似度(距離),并将兩個相似度最高的簇合成一個簇,然後反複疊代,直到所有的資料都被劃分到一個簇中。

分裂層次聚類

這是一種自頂向下的聚類算法,算法開始時,每個觀測樣例都被劃分同一個簇中,然後算法開始将簇分裂成兩個相異度最大的小簇,并反複疊代,直到每個觀測值屬于單獨一個簇。

在執行層次聚類操作之前,我們需要确定兩個簇之間的相似度到底有多大,通常我們會使用一些距離計算公式:

最短距離法(single linkage),計算每個簇之間的最短距離:

dist(c1,c2) = min dist(a,b)

最長距離法(complete linkage),計算每個簇中兩點之間的最長距離:

dist(c1,c2) = max dist(a,b)

平均距離法(average linkage),計算每個簇中兩點之間的平均距離:

最小方差法(ward),計算簇中每個點到合并後的簇中心的距離差的平方和。

調用plot函數繪制聚類圖,樣例的hang值小于0,是以聚類樹将從底部顯示标簽,并使用cex将坐标軸上的标簽字型大小縮小為正常的70%,此外,為了比較最小方差法和最短距離法在層次聚類上的差異,我們還繪制了使用最短距離法得到的聚類樹圖。

分裂層次聚類

調用diana函數執行分裂層次聚類

library(cluster)
dv = diana(customer,metric = "euclidean")
           

調用summary函數輸出模型特征信

如果想建構水準聚類樹

library(magrittr)
dend = customer %>% dist %>% hclust %>% as.dendrogram
dend %>% plot(horiz = TRUE,main = "Horizontal Dendrogram")
           
R語言使用層次聚類處理資料

水準聚類樹

繼續閱讀