Учитывая сумму квадратов 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
, и теперь мы показываем, как подобранный метод вписывается в вышеприведенное в комментариях, завершающих строки кода.