天天看點

無監督學習 聚類分析③

确定最佳聚類數目

  • 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 = "支援名額數")
           
無監督學習 聚類分析③

可以看到有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)

           
無監督學習 聚類分析③
無監督學習 聚類分析③

繼續閱讀