Ответ 1
Учитывая сумму сумм квадратов betweenss
и вектор внутри суммы квадратов для каждого кластера withinss
, следующие формулы:
totss = tot.withinss + betweenss
tot.withinss = sum(withinss)
Например, если бы существовал только один кластер, тогда betweenss
был бы 0
, в withinss
и totss = tot.withinss = withinss
был бы только один компонент.
Для дальнейшего уточнения мы можем вычислить эти различные величины, которые сами задают кластерные назначения, и это может помочь прояснить их значения. Рассмотрим данные x
и назначения кластера cl$cluster
из примера в help(kmeans)
. Определите сумму функций квадратов следующим образом: это вычитает среднее значение каждого столбца x из этого столбца, а затем суммы квадратов каждого элемента оставшейся матрицы:
# or ss <- function(x) sum(apply(x, 2, function(x) x - mean(x))^2)
ss <- function(x) sum(scale(x, scale = FALSE)^2)
Тогда имеем следующее. Заметим, что cl$centers[cl$cluster, ]
- это установленные значения, т.е. Это я - матрица с одной строкой на точку, так что i-я строка является центром кластера, к которому принадлежит i-я точка.
example(kmeans) # create x and cl
betweenss <- ss(cl$centers[cl$cluster,]) # or ss(fitted(cl))
withinss <- sapply(split(as.data.frame(x), cl$cluster), ss)
tot.withinss <- sum(withinss) # or resid <- x - fitted(cl); ss(resid)
totss <- ss(x) # or tot.withinss + betweenss
cat("totss:", totss, "tot.withinss:", tot.withinss,
"betweenss:", betweenss, "\n")
# compare above to:
str(cl)
EDIT:
Поскольку этот вопрос был дан ответ, R добавил дополнительные аналогичные примеры kmeans
(example(kmeans)
) и новый метод fitted.kmeans
, и теперь мы покажем, как соответствующий метод вписывается в приведенное выше в комментарии, заканчивающем строки кода.