R語言數據分析與挖掘(第九章):聚類分析(1)——動態聚類

  • 2019 年 12 月 13 日
  • 筆記

動態聚類演算法屬於基於質心的聚類,其基本思想為:選擇一批凝聚點或給出一個初始的分類,讓樣品按某原則向凝聚點凝聚,對凝聚點進行不斷的修改或迭代,直至分類比較合理或迭代穩定為止。動態聚類法有許多種方法,本文介紹比較流行的K均值法和K中心法。

函數介紹

在R語言中,用於實現k-means聚類的函數為kmeans(),其的數的基本書寫寫格式為:

kmeans(x, centers, iter.max = 10, nstart = 1,         algorithm = c("Hartigan-Wong", "Lloyd", "Forgy",                       "MacQueen"), trace=FALSE)  ## S3 method for class 'kmeans'  fitted(object, method = c("centers", "classes"), ...)

參數介紹:

X:指定用於聚類的數值型矩陣或可以轉換為矩陣的對象;

Centers:可以為整數或數值向量,整數用於指定聚類數目k,數值向量用於指定初始類質心;

iter.max:用於指定最大迭代次數;

nstart:當參數centers為整數時,本參數用於指定隨機抽取的數據集的個數;

Algorithm:指定用於聚類的演算法,可供選擇的演算法有: "Hartigan-Wong","Lloyd","Forgy"和"MacQueen";

Trace:可以為邏輯值或整數,目前僅用於默認方法,即"Hartigan-Wong". 若為TRUE,則指定生成關於演算法進度的跟蹤資訊,當為整數時,更高的值將會指定生成更多的跟蹤資訊。

函數K-means()的返回結果是一個列表,包括:

cluster表示存儲各觀測值所屬的類別編號;

centers表示存儲最終聚類結果的各個類別的質心點;

tots表示所有聚類變數的離差平方和;

wihiness表示每個類別中所有聚類變數的離差平方和,該參數用於刻畫各個類別中樣本觀測點的離散程度;

tot.withiness表示每個類別中所有聚類變數的離差平方和的總和,即wihiness的結果求和;

bewees表示各類別間的聚類變數的離差平方和之和;size表示各個類別的作

本量。

在R語言中,用於實現k-medoids聚類的函數為pam(),該函數存儲在R包cluser

中,其函數的基本書寫格式為:

pam(x, k, diss = inherits(x, "dist"),      metric = c("euclidean", "manhattan"),      medoids = NULL, stand = FALSE, cluster.only = FALSE,      do.swap = TRUE,      keep.diss = !diss && !cluster.only && n < 100,      keep.data = !diss && !cluster.only,      pamonce = FALSE, trace.lev = 0)

參數介紹:

X:指定用於聚類的數據對象;

Diss:邏輯值,若為TRUE,則x將被視為不相似矩陣。若為FALSE, 則x將被視為變數的觀測矩陣,默認值為"dist" 或不相似對象;

Metric:指定樣本間距離測算的方式,可供選擇的有"euclidean"和"mahattan",默認值為"euclidean";

Medoids:取值為NULL或一個k維向量,當取值為NULL時,指定初始中心點樣本由軟體自行選擇,默認值為NULL;

Stand:指定進行聚類前是否對數據機型標準化;

cluster.only:邏輯值,指定聚類結果是否僅包括各樣本點所歸屬的類別,若取值為TRUE,則演算法的效率更高,默認值為FALSE;

do.swap:邏輯值,用於指定交換階段是否應發生,若為TRUE,則指定原始演算法,若為FALSE,則表示交換階段的電腦密集程度遠大於構建階段,所以可以通過do.swap = FALSE跳過,默認值為TRUE;

kep.diss: 邏輯值,指定相似性和或者輸入數據x是否應該是邏輯值,默認值

為!diss && !cluster.only &&n< 100;

kep.da:邏輯值,指定是否在聚類結果中保留數據集,默認值為!diss&& !clustcr.only;

Pamoncer:邏和值成為0到2之間的熬數,州定由Reynolds符人提出的演算法快

捷方式,默認值為FALSE:

trace.lev:一個整數,指定在演算法的構建和交換階段期間的跟蹤級別,更高的值將會指定生成更多的跟蹤資訊,默認位為0,即不列印任何東西。

案例:基於隨機生成序列的動態聚類

> set.seed(1234)  > dat <- rbind(matrix(rnorm(100, mean=0,sd = 0.2), ncol = 2),matrix(rnorm(100,mean = 1, sd = 0.3), ncol = 2))  > colnames(dat) <- c("x", "y")  > plot(dat)

上訴程式碼表示,隨機生成兩列正態分布數據,第一列的均值為0,標準差為0.2,第二列的均值為1,標準差為0.3,散點圖的結果如上圖,不難看出,樣本點大致分為2類,下面我們進行k-means聚類。

(kmeans.1 <- kmeans(dat, 2))    plot(dat, col = kmeans.1$cluster,main="聚成2類")  points(kmeans.1$centers, col = 3:4, pch = 8, cex = 2)

上訴程式碼表示將原始數據聚成2類,將聚類結果繪製出來,利用不同顏色區分類別,最後標出類質心。

此外,還可以嘗試將原始數據聚成3類,程式碼如下:

(kmeans.2 <- kmeans(dat, 3))  plot(dat, col = kmeans.2$cluster,main="聚成3類")  points(kmeans.2$centers, col = 3:5, pch = 8, cex = 2)

k-medoids聚類

下面我們利用同樣的數據集進行k-medoids聚類

library(cluster)  pam1<-pam(dat,2)  summary(pam1)  par(mfrow=c(1,2))  plot(pam1)

上述程式碼表示利用函數pam()將dat數據集的聚類分成2類,聚類結果的展示如下圖,左圖展示了每一類的樣本點分布,右邊的影像顯示了2個簇的陰影,當si的值較大即接近1時,表示相應的觀測點能夠正確的劃分到相似較大的簇中,圖中2個簇的si值是0.77和0.64.說明劃分結果較好。

同樣我們也可以將結果分為3類

pam2<-pam(dat,3)  summary(pam2)  plot(pam2)

程式碼運行後,可以明顯看出,第三類是在左邊的大類中劃分出來的,各個類別之間的距離用直線標註;右圖中的si值顯示,當原始數據聚成3類時,其中一類的si值較小,說明劃分結果不是很理想,比較k-medoids聚類的結論不一致,說明原始樣本中含有極端值,對k-means聚類結果影響較大。