#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")