Comment calculer BIC pour K-signifie regroupement en R

j'ai utilisé k-means pour Regrouper mes données en R mais j'aimerais pouvoir évaluer l'ajustement par rapport à la complexité du modèle de mon regroupement en utilisant Baysiean Information Criterion (BIC) et AIC. Actuellement, le code que J'utilise dans R est:

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

mais j'aimerais pouvoir extraire la probabilité BIC et Log. Toute aide serait grandement appréciée!

19
demandé sur UnivStudent 2013-04-05 21:19:16

4 réponses

pour quiconque atterrit ici, il y a une méthode proposée par Sherry Towers à http://sherrytowers.com/2013/10/24/k-means-clustering/, qui utilise la sortie de stats::kmeans. Je cite:

L'AIC peut être calculé avec la fonction suivante:

kmeansAIC = function(fit){

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

De l'aide pour stats::AIC, vous pouvez également voir que le BIC peut être calculé de la même manière que le AIC. Un moyen facile d'obtenir le BIC est de remplacer le return() dans le ci-dessus fonction, avec ceci:

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

alors vous utiliserez ceci comme suit:

fit <- kmeans(x = data,centers = 6)
kmeansAIC(fit)
14
répondu Andy Clifton 2014-08-28 20:15:30

pour calculer BIC, il suffit d'ajouter .5*k*d*log(n) (où k est le nombre de moyens, d est la longueur d'un vecteur dans votre jeu de données, et n est le nombre de points de données) à la fonction d'erreur standard K-means.

la pénalité standard k-means est \sum_n (m_k(n)-x_n)^2, où m_k(n) est la moyenne associée au nième point de données. Cette pénalité être interprété comme une probabilité logarithmique, donc BIC est parfaitement valide.

BIC ajoute juste un terme de pénalité supplémentaire pour les k-means erreur proportionnelle à k.

6
répondu user1149913 2013-04-08 04:33:52

juste pour ajouter à ce que user1149913 a dit( Je n'ai pas assez de réputation pour commenter), puisque vous utilisez la fonction kmeans dans R,\sum_n (m_k(n)-x_n)^2 est déjà calculé pour vous que KClData$tot.withinss.

3
répondu FrankD 2014-07-31 16:13:58

plutôt que de réimplémenter AIC ou BIC, nous pouvons définir une fonction log-probability pour kmeans objets; ce seront ensuite utilisés par l' BIC dans la fonction stats paquet.

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

alors pour l'utiliser, appelez BIC comme d'habitude. Par exemple:

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

cette méthode sera fournie dans la prochaine version de stackoverflow paquet.

2
répondu Neal Fultz 2018-01-15 19:56:16