1. 程式人生 > >R語言聚類演算法比較

R語言聚類演算法比較

說明

在使用不同的聚類演算法完成資料聚類操作後,我們可以對演算法的效能進行評估,絕大多數情況下,我們即可以使用簇內距離也可以使用簇間距離作為評價標準。使用fpc演算法包的cluster.stat函式來比較不同的聚類演算法。

操作

匯入fpc包,選擇層次聚類演算法,距離計算採用single方法(最短距離法),將得到簇存放在hc_single中:

library(fpc)
single_c = hclust(dist(customer),method = "single")
hc_single = cutree(single_c,k = 4)

選擇層次聚類演算法,距離計算採用complete方法(最長距離法),將得到的簇存放在hc_complete:

complete_c = hclust(dist(customer),method = "complete")
hc_complte = cutree(complete_c,k = 4)

選擇k均值聚類演算法,將得到的簇存放km物件中:

set.seed(22)
km = kmeans(customer,4)

獲得km聚類演算法聚類結果的基本統計資訊:

cs = cluster.stats(dist(customer),km$cluster)

通常我們習慣使用within.cluster.ss和avg.silwidth這兩個函式來驗證聚類演算法:

cs[c("within.cluster.ss"
,"avg.silwidth")] $within.cluster.ss [1] 61.3489 $avg.silwidth [1] 0.4640587

將得到的不同方法生成聚類結果的統計資訊並以列表顯示:

sapply(list(kmeans = km$cluster,hc_single = hc_single,hc_complte = hc_complte), function(c)cluster.stats(dist(customer),c)[c("within.cluster.ss","avg.silwidth")])
                  kmeans    hc_single hc_complte
within.cluster
.ss 61.3489 136.0092 65.94076 avg.silwidth 0.4640587 0.2481926 0.4255961

原理

聚類結果的驗證通常採用兩種技術:簇內距離和簇間距離。其中,簇間距離距離越大,聚類效果越好,而簇內距離越小,聚類效果越理想。使用fpc包中的cluster.stat函式來計算訓練好的聚類物件的相關統計資訊。
從輸出結果可以得知,within.cluster.ss計算的是每個聚類內部的距離平方程,而avg.silwidth計算的是平均輪廓值。within.cluster.ss的計算結果體現了同一個簇之間物件的相關程度,該值越小,簇內物件的相關性越大。而avg.silwidth值則同時考慮了簇內物件的聚合度和簇內物件的聚合度簇間物件的分離度。數學上對於每個點x可以採用下列公式計算其輪廓係數:
輪廓係數(x) = [b(x) - a(x)]/max([b(x),a(x)])
其中,a(x)是點x到所有與它在同一簇中的其他點的平均距離,而b(x)則是點x到所有與它不在同一簇的點平均距離的最小值。通常輪廓係數取值範圍為0~1,越接近於1說明聚類效果越好。
從最後產生的結果可以知道,在within.cluster.ss和avg.silwidth測量長度下基於最長距離的層次聚類演算法的聚類效果要優於最短距離層次聚類演算法和k均值演算法。