Как рассчитать BIC для кластеризации k-средних в R
Я использовал k-средства для кластеризации своих данных в R, но мне бы хотелось оценить сложность кластеризации по сравнению с моделью, используя Baysiean Information Criterion (BIC) и AIC. В настоящее время код, который я использовал в R:
KClData <- kmeans(Data, centers=2, nstart= 100)
Но я хотел бы иметь возможность извлечь BIC и Log Lizelihood. Любая помощь будет принята с благодарностью!
Ответы
Ответ 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
.