聚類分析是發現數據集蔟或模式的數據探索技術。常用的聚類方法有基於劃分的聚類、基於層次的聚類、基於密度的聚類幾種。這篇文章主要介紹基於劃分的Kmeans聚類方法的實現過程。
Kmeans算法是一種非常常見的聚類算法,基本思想非常簡單,這裡只介紹聚類算法在R語言下的實現過程及可視化展現結果。
1.模擬數據聚類
Kmeans算法需要求解各變量的均值,因此它要求輸入的數據集必須為連續的書之行數據。在R語言中,只需要利用stats包中的kmeans函數就能實現kmeans聚類方法。stats包無需使用者再次安裝。
kmeans函數的具體形式如下:
kmeans(x, centers, iter.max = 10, nstart = 1)
x: 輸入的數據集
centers:選擇的聚類數或者初始的類中心
iter.max:最大的迭代次數
kmeans函數返回的結果如下:
cluster:返回的聚類判別結果
centers:最終的聚類中心
totss:總的方差
withinss:各組組內方差
tot.withinss:總的組內方差
betweenss:各組的組間方差
size:各組的樣本數
聚類結果的好壞可以通過組內方差與組間方差、總方差的關係來評價。其目的是儘可能的保證聚類後,各組內的數據進來同質、類與類間的數據儘量異質。因此,聚類後的數據,組內數據方差要儘可能的小,組間的方差要儘可能的大。也就是tot.withinss越小越好、betweenss(totss-tot.withinss)越大越好。進一步的,可以寫作F=betweenss/tot.withinss,當滿足F值越大,則可以認為聚類效果越好。
1.1首先模擬隨機數據集
df <- rbind(matrix(rnorm(100, sd = 0.3), ncol = 2),
matrix(rnorm(100, mean = 1, sd = 0.3), ncol = 2))
colnames(df) <- c("x", "y")
head(df)
1.2對隨機數據集進行聚類
km.res <- kmeans(df, 2, nstart = 25)
km.res$cluster
1.2查看聚類後每組樣本量
km.res$size
[1] 49 51
1.3查看每組的類中心
km.res$centers
x y
1 0.98627113 0.94750468
2 -0.02258131 -0.04924449
1.4根據聚類結果,繪製樣本點與類中心
plot(df, col = km.res$cluster, pch = 19, frame = FALSE,
main = "K-means with k = 2")
points(km.res$centers, col = 1:2, pch = 8, cex = 3)
1.5下面看看聚4類的結果
km.res <- kmeans(df, 4, nstart = 25)
km.res$cluster
km.res$size
plot(df, col = km.res$cluster, pch = 19, frame = FALSE,
main = "K-means with k = 4")
points(km.res$centers, col = 1:4, pch = 8, cex = 3)
1.6kmeans所有返回結果
km.res
2.實際數據聚類結果
這裡選用R語言自帶的USArrests數據集,該數據的具體結構如下:
data("USArrests")
str(USArrests)
過濾掉所有缺失數據
df <- na.omit(USArrests)
head(df)
2.1描述性統計分析
desc_stats <- data.frame(
Min = apply(df, 2, min), # 最小值
Med = apply(df, 2, median), # 中位數
Mean = apply(df, 2, mean), # 均值
SD = apply(df, 2, sd), # 標準差
Max = apply(df, 2, max) # 最大值
)
desc_stats <- round(desc_stats, 1)
head(desc_stats)
2.2聚類
聚類前先對數據進行標準化處理
df<-scale(df)
利用factoextra包的fviz_nbclust() 函數尋找最佳的聚類數
install.packages('factoextra')
library(factoextra)
set.seed(123)
fviz_nbclust(df, kmeans, method = "wss") +
geom_vline(xintercept = 4, linetype = 2)
從圖形結果看,曲線在K=4的節點上,曲線趨勢趨於平緩,因此可以選擇聚4類。
set.seed(123)
km.res <- kmeans(df, 4, nstart = 25)
print(km.res)
2.3聚類中心
aggregate(USArrests, by=list(cluster=km.res$cluster), mean)
2.4結果展現
一種展現方法是利用factoextra包的fviz_cluster函數實現
fviz_cluster(km.res, data = df)
調整frame.type參數,讓蔟的形狀更美觀
fviz_cluster(km.res, data = df,frame.type = "t")
調整橢圓透明度與大小
fviz_cluster(km.res, data = df, frame.type = "t", frame.alpha = 0, frame.level = 0.7)
只顯示樣本文本內容
fviz_cluster(km.res, data = df, frame.type = "t", frame.alpha = 0, frame.level = 0.7, geom = "text")
當然,還可以通過cluster包的clusplot進行聚類結果的可視化展現。
install.packages('cluster')
library(cluster)
clusplot(scale(USArrests), km.res$cluster, main = "Cluster plot",
color=TRUE, labels = 2, lines = 0)