Кластеризація залежить, зокрема, від масштабу . Для обговорення цього питання див. (У тому числі ) Коли слід зосередити та стандартизувати дані? і PCA на коваріації чи кореляції? .
Ось ваші дані, складені у співвідношенні сторін 1: 1, які розкривають, наскільки масштаби двох змінних відрізняються:
Праворуч графік статистики розриву показує статистику за кількістю кластерів ( ) зі стандартними помилками, намальованими вертикальними відрізками, та оптимальним значенням позначеним вертикальною пунктирною синьою лінією. Згідно довідки,kккclusGap
Метод за замовчуванням "firstSEmax" шукає найменший такий, що його значення не більше 1 стандартної помилки від першого локального максимуму.f ( k )кf( k )
Інші методи поводяться аналогічно. Цей критерій не спричиняє виділення жодної статистики розривів, в результаті чого .k = 1
Вибір масштабу залежить від програми, але розумною початковою точкою за замовчуванням є міра розповсюдження даних, наприклад, MAD або стандартне відхилення. Цей графік повторює аналіз після повторного перегляду на нуль і масштабування, щоб зробити одиничне стандартне відхилення для кожного компонента і :bаб
Рішення K-засобів позначається різними типами символів та кольором у розкиданні даних ліворуч. Серед безлічі , явно виступають в сюжеті статистики розриву справа: це перший локальний максимум і статистика для менших (тобто, ) значно нижчі. Більш великі значення , ймовірно, є надлишковими для такого невеликого набору даних, і жодне не суттєво краще, ніж . Вони показані тут лише для ілюстрації загального методу. k ∈ { 1 , 2 , 3 , 4 , 5 } k = 2 k k = 1 k k = 2k = 2k ∈ { 1 , 2 , 3 , 4 , 5 }k = 2кk = 1кk = 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"
}