确定最佳聚類數目
-
Nbclust包
Nbclust包是《R語言實戰》上一個包,定義了幾十個評估名額,聚類數目從2周遊到15(自己設定),然後通過這些名額看分别在聚類數為多少時達到最優,最後選擇名額支援數最多的聚類數目就是最佳聚類數目。
library(gclus)
data(wine)
head(wine)
dataset <- wine[,-1] #去除分類标簽
dataset <- scale(dataset)
library(NbClust)
set.seed(1234) #因為method選擇的是kmeans,是以如果不設定種子,每次跑得結果可能不同
nb_clust <- NbClust(dataset, distance = "euclidean",
min.nc=2, max.nc=15, method = "kmeans",
index = "alllong", alphaBeale = 0.1)
barplot(table(nb_clust$Best.nc[1,]),
xlab = "聚類數",ylab = "支援名額數")
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuEjZklTN2I2NxUWM0Q2NmJDMjJmMhBDM2AjY0YTNhJWNfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
可以看到有16個名額支援最佳聚類數目為3,5個名額支援聚類數為2,是以該方法推薦的最佳聚類數目為3.
-
SSE(組内平方誤差和)
wssplot <- function(data, nc=15, seed=1234){
wss <- (nrow(data)-1)*sum(apply(data,2,var))
for (i in 2:nc){
set.seed(seed)
wss[i] <- sum(kmeans(data, centers=i)$withinss)
}
plot(1:nc, wss, type="b", xlab="Number of Clusters",
ylab="Within groups sum of squares")}
wssplot(dataset)
随着聚類數目增多,每一個類别中數量越來越少,距離越來越近,是以WSS值肯定是随着聚類數目增多而減少的,是以關注的是斜率的變化,但WWS減少得很緩慢時,就認為進一步增大聚類數效果也并不能增強,存在得這個“肘點”就是最佳聚類數目,從一類到三類下降得很快,之後下降得很慢,是以最佳聚類個數選為三
-
factoextra包
library(factoextra)
library(ggplot2)
set.seed(1234)
fviz_nbclust(dataset, kmeans, method = "wss") +
geom_vline(xintercept = 3, linetype = 2)
標明為3類或者2類為最佳聚類數目
用該包下的fviz_cluster函數可視化一下聚類結果
km.res <- kmeans(dataset,3)
fviz_cluster(km.res, data = dataset)