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!
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)
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
.
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
.
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.