Подтвердить что ты не робот

Как рассчитать BIC для кластеризации k-средних в R

Я использовал k-средства для кластеризации своих данных в R, но мне бы хотелось оценить сложность кластеризации по сравнению с моделью, используя Baysiean Information Criterion (BIC) и AIC. В настоящее время код, который я использовал в R:

KClData <- kmeans(Data, centers=2, nstart= 100)

Но я хотел бы иметь возможность извлечь BIC и Log Lizelihood. Любая помощь будет принята с благодарностью!

4b9b3361

Ответ 1

Для тех, кто приземляется здесь, существует метод, предложенный Sherry Towers на http://sherrytowers.com/2013/10/24/k-means-clustering/, который использует вывод из stats::kmeans. Я цитирую:

AIC можно вычислить со следующей функцией:

kmeansAIC = function(fit){

m = ncol(fit$centers)
n = length(fit$cluster)
k = nrow(fit$centers)
D = fit$tot.withinss
return(D + 2*m*k)
}

Из справки для stats::AIC вы также можете увидеть, что BIC можно вычислить аналогично AIC. Легкий способ получить BIC - заменить return() в вышеперечисленной функции следующим образом:

return(data.frame(AIC = D + 2*m*k,
                  BIC = D + log(n)*m*k))

Итак, вы использовали бы это следующим образом:

fit <- kmeans(x = data,centers = 6)
kmeansAIC(fit)

Ответ 2

Чтобы вычислить BIC, просто добавьте .5*k*d*log(n) (где k - количество средств, d - длина вектора в вашем наборе данных, а n - количество точек данных) к стандарту k - означает функцию ошибки.

Стандартное k-значение штрафа \sum_n (m_k(n)-x_n)^2, где m_k(n) - среднее значение, связанное с n-й точкой данных. Это наказание может быть истолковано как логарифмическая вероятность, поэтому BIC отлично действует.

BIC просто добавляет дополнительный штрафный член к ошибке k-значений, пропорциональной k.

Ответ 3

Просто добавьте к тому, что user1149913 сказал (у меня недостаточно репутации для комментариев), так как вы используете функцию kmeans в R, \sum_n (m_k(n)-x_n)^2 уже рассчитан для вас как KClData$tot.withinss.

Ответ 4

Вместо переопределения AIC или BIC мы можем определить функцию логарифмического правдоподобия для объектов kmeans; это будет затем использоваться функцией BIC в пакете stats.

logLik.kmeans <- function(object) structure(
  -object$tot.withinss/2,
  df = nrow(object$centers)*ncol(object$centers),
  nobs = length(object$cluster)
)

Затем, чтобы использовать его, вызовите BIC как обычно. Например:

example(kmeans, local=FALSE)
BIC(cl)
# [1] 26.22842084

Этот метод будет предоставлен в следующей версии пакета stackoverflow.