Кластеризация зависит от масштаба , между прочим. Обсуждение этой проблемы см. ( Среди прочего ). Когда следует центрировать и стандартизировать данные? а спс на ковариацию или корреляцию? ,
Вот ваши данные, полученные с соотношением сторон 1: 1, показывающие, насколько различны шкалы двух переменных:
Справа от графика статистики разрыва показана статистика по количеству кластеров ( ) со стандартными ошибками, нарисованными вертикальными сегментами, и оптимальное значение помеченное вертикальной пунктирной синей линией. Согласно помощи,кККclusGap
Метод по умолчанию «firstSEmax» ищет наименьшее , так что его значение составляет не более 1 стандартной ошибки от первого локального максимума.f ( k )Ке( к )
Другие методы ведут себя аналогично. Этот критерий не приводит к выделению какой-либо статистики пропусков, что приводит к оценке .к = 1
Выбор масштаба зависит от приложения, но разумной начальной точкой по умолчанию является мера разброса данных, например MAD или стандартное отклонение. Этот график повторяет анализ после повторного центрирования до нуля и масштабирования, чтобы получить стандартное отклонение для каждого компонента и :бaб
Решение K-средних обозначено изменением типа и цвета символа на диаграмме рассеяния данных слева. Среди множества , явно выступают в сюжете статистики разрыва справа: это первый локальный максимум и статистика для меньших (то есть, ) значительно ниже. Большие значения , вероятно, подходят для такого небольшого набора данных, и ни одно из них не значительно лучше, чем . Они показаны здесь только для иллюстрации общего метода. k ∈ { 1 , 2 , 3 , 4 , 5 } k = 2 k k = 1 k k = 2к = 2k ∈ { 1 , 2 , 3 , 4 , 5 }к = 2Кк = 1Кк = 2
Вот R
код для получения этих цифр. Данные примерно соответствуют показанным в вопросе.
library(cluster)
xy <- matrix(c(29,391, 31,402, 31,380, 32.5,391, 32.5,360, 33,382, 33,371,
34,405, 34,400, 34.5,404, 36,343, 36,320, 36,303, 37,344,
38,358, 38,356, 38,351, 39,318, 40,322, 40, 341), ncol=2, byrow=TRUE)
colnames(xy) <- c("a", "b")
title <- "Raw data"
par(mfrow=c(1,2))
for (i in 1:2) {
#
# Estimate optimal cluster count and perform K-means with it.
#
gap <- clusGap(xy, kmeans, K.max=10, B=500)
k <- maxSE(gap$Tab[, "gap"], gap$Tab[, "SE.sim"], method="Tibs2001SEmax")
fit <- kmeans(xy, k)
#
# Plot the results.
#
pch <- ifelse(fit$cluster==1,24,16); col <- ifelse(fit$cluster==1,"Red", "Black")
plot(xy, asp=1, main=title, pch=pch, col=col)
plot(gap, main=paste("Gap stats,", title))
abline(v=k, lty=3, lwd=2, col="Blue")
#
# Prepare for the next step.
#
xy <- apply(xy, 2, scale)
title <- "Standardized data"
}