Как определить оптимальное количество кластеров в естественных разрывах Дженкса

#r #cluster-analysis

#r #кластерный анализ

Вопрос:

Я использую естественные разрывы Дженкса в R для проведения кластеризации на большом наборе данных, который состоит из 60000 точек данных. Обычно k-means использует метод локтя. Как я могу применить метод локтя к Дженксу, чтобы определить нет. оптимальных кластеров?

Ответ №1:

Мы используем пример из BAMMtools:

 library(BAMMtools)
data(whales, events.whales)
ed <- getEventData(whales, events.whales, burnin=0.25, nsamples=500)

ed <- dtRates(ed, tau=0.01)
vec <- ed$dtrates$rates[[1]]
  

Вы можете рассчитать общее количество внутри, как только узнаете группы. Я использую функцию anova в R для вычисления этого:

 cal_wss = function(values,group){
                  if(is.numeric(group)){
                         group = factor(group)
                  }
                  sum((aov(values ~ group)$residuals^2))
                  }

kmeans3 = kmeans(vec,3,nstart=100)

kmeans3$tot.withinss
[1] 0.4228335

cal_wss(vec,kmeans3$cluster)
[1] 0.4228335
  

Итак, мы видим, что функция дает тот же результат, что и внутреннее вычисление kmeans. Теперь мы запускаем его для разных значений k в kmeans и естественном разрыве Дженкса:

 kmeans_withinss = sapply(2:10,function(i)kmeans(vec,i,nstart=100)$tot.withinss)

j_withinss = sapply(2:10,function(i){
                    Jenk = getJenksBreaks(vec,i 1)
                    clus = cut(vec,breaks=Jenk,include.lowest =TRUE)
                    cal_wss(vec,clus)
                   })

par(mfrow=c(1,2))

plot(2:10,kmeans_withinss,xlab="k",ylab="within ss",main="kmeans")

plot(2:10,j_withinss,xlab="k",ylab="within ss",main="Jenk")
  

введите описание изображения здесь