R語言數據分析與挖掘(第九章):聚類分析(1)——動態聚類
- 2019 年 12 月 13 日
- 筆記
函數介紹
在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聚類結果影響較大。
