Calcular el criterio de agrupación BIC (para validar agrupaciones después de K-means)

9

Me pregunto si hay una buena manera de calcular el criterio de agrupamiento basado en la fórmula BIC, para una salida de k-medias en R? Estoy un poco confundido sobre cómo calcular ese BIC para poder compararlo con otros modelos de agrupación. Actualmente estoy usando la implementación del paquete de estadísticas de k-means.

Estudiante
fuente
Tenga en cuenta que este criterio está diseñado para usarse con k-medias. En agrupaciones obtenidas por diferentes algoritmos, puede ser inapropiado (en particular para algoritmos de agrupación basados ​​en densidad)
Tiene SALIDA - Anony-Mousse

Respuestas:

6

Para calcular el BIC para los resultados de kmeans, probé los siguientes métodos:

  1. La siguiente fórmula es de: [ref2] ingrese la descripción de la imagen aquí

El código r para la fórmula anterior es:

  k3 <- kmeans(mt,3)
  intra.mean <- mean(k3$within)
  k10 <- kmeans(mt,10)
  centers <- k10$centers
  BIC <- function(mt,cls,intra.mean,centers){
    x.centers <- apply(centers,2,function(y){
      as.numeric(y)[cls]
    })
    sum1 <- sum(((mt-x.centers)/intra.mean)**2)
    sum1 + NCOL(mt)*length(unique(cls))*log(NROW(mt))
  }
#

El problema es que cuando uso el código r anterior, el BIC calculado aumentaba monótonamente. ¿Cual es la razón?

ingrese la descripción de la imagen aquí

[ref2] Ramsey, SA, y col. (2008) "Descubrir un programa transcripcional de macrófagos integrando evidencia de escaneo de motivos y dinámica de expresión". PLoS Comput Biol 4 (3): e1000021.

  1. He usado la nueva fórmula de /programming/15839774/how-to-calculate-bic-for-k-means-clustering-in-r

    BIC2 <- function(fit){
    m = ncol(fit$centers)
        n = length(fit$cluster)
    k = nrow(fit$centers)
        D = fit$tot.withinss
    return(data.frame(AIC = D + 2*m*k,
                      BIC = D + log(n)*m*k))
    }

Este método tiene el valor BIC más bajo en el número de clúster 155. ingrese la descripción de la imagen aquí

  1. usando el método proporcionado @ttnphns, el código R correspondiente como se detalla a continuación. Sin embargo, el problema es ¿cuál es la diferencia entre Vc y V? ¿Y cómo calcular la multiplicación por elementos para dos vectores con diferente longitud?

    BIC3 <- function(fit,mt){
    Nc <- as.matrix(as.numeric(table(fit$cluster)),nc=1)
    Vc <- apply(mt,2,function(x){
        tapply(x,fit$cluster,var)
     })
    V <- matrix(rep(apply(mt,2,function(x){
    var(x)
    }),length(Nc)),byrow=TRUE,nrow=length(Nc))
    LL = -Nc * colSums( log(Vc + V)/2 ) ##how to calculate this? elementa-wise multiplication for two vectors with different length?
    BIC = -2 * rowSums(LL) + 2*K*P * log(NRoW(mt))
    return(BIC)
    }
pengchy
fuente
1
Probablemente estabas haciendo algo diferente. Se indicó en mi "pseudocódigo" que Vces la matriz P x K y Vera una columna que luego se propagaba K veces en la matriz del mismo tamaño. Entonces (punto 4 en mi respuesta) puede agregar Vc+V. Luego tome el logaritmo, divídalo entre 2 y calcule las sumas de la columna. El vector de fila resultante se multiplica (valor por valor, es decir, por elementos) con la fila Nc.
ttnphns
1
He agregado fórmulas en mi respuesta, para que pueda comparar y decir si lo que está haciendo es eso o no.
ttnphns
3

No uso R, pero aquí hay un cronograma que espero lo ayude a calcular el valor de los criterios de agrupación BIC o AIC para cualquier solución de agrupación dada.

Este enfoque sigue los algoritmos de SPSS Análisis de conglomerados de dos pasos (consulte las fórmulas allí, comenzando desde el capítulo "Número de conglomerados", luego pase a "Distancia de probabilidad de registro" donde se define ksi, la probabilidad de registro). BIC (o AIC) se calcula en función de la distancia de probabilidad logarítmica. A continuación se muestran los cálculos solo para datos cuantitativos (la fórmula que figura en el documento SPSS es más general e incorpora también datos categóricos; solo se trata su "parte" de datos cuantitativos):

X is data matrix, N objects x P quantitative variables.
Y is column of length N designating cluster membership; clusters 1, 2,..., K.
1. Compute 1 x K row Nc showing number of objects in each cluster.
2. Compute P x K matrix Vc containing variances by clusters.
   Use denominator "n", not "n-1", to compute those, because there may be clusters with just one object.
3. Compute P x 1 column containing variances for the whole sample. Use "n-1" denominator.
   Then propagate the column to get P x K matrix V.
4. Compute log-likelihood LL, 1 x K row. LL = -Nc &* csum( ln(Vc + V)/2 ),
   where "&*" means usual, elementwise multiplication;
   "csum" means sum of elements within columns.
5. Compute BIC value. BIC = -2 * rsum(LL) + 2*K*P * ln(N),
   where "rsum" means sum of elements within row.
6. Also could compute AIC value. AIC = -2 * rsum(LL) + 4*K*P

Note: By default SPSS TwoStep cluster procedure standardizes all
quantitative variables, therefore V consists of just 1s, it is constant 1.
V serves simply as an insurance against ln(0) case.

Los criterios de agrupación AIC y BIC se utilizan no solo con la agrupación K-means. Pueden ser útiles para cualquier método de agrupación que trate la densidad dentro del grupo como la varianza dentro del grupo. Debido a que AIC y BIC deben penalizar por "parámetros excesivos", tienden inequívocamente a preferir soluciones con menos grupos. "Menos grupos más disociados unos de otros" podría ser su lema.

Puede haber varias versiones de los criterios de agrupación BIC / AIC. El que mostré aquí usa Vc, dentro de las variaciones de conglomerados , como el término principal de la probabilidad logarítmica. Alguna otra versión, quizás más adecuada para la agrupación de k-medias, podría basar la probabilidad logarítmica en las sumas de cuadrados dentro del grupo .

La versión en pdf del mismo documento de SPSS al que me referí.

Y aquí están finalmente las fórmulas mismas, correspondientes al pseudocódigo anterior y al documento; está tomado de la descripción de la función (macro) que he escrito para usuarios de SPSS. Si tiene alguna sugerencia para mejorar las fórmulas, publique un comentario o una respuesta.

ingrese la descripción de la imagen aquí

ttnphns
fuente
Gracias, gracias por su respuesta. Me pregunto si podría explicar esto con respecto a la función objetivo que minimiza la suma de cuadrados dentro del clúster.
UnivStudent
Puede ver que la fórmula es casi la misma que la segunda en wiki . Allí, LL se basa en la varianza del errorσe2que está Vcen mi notación (la varianza agrupada dentro del clúster). Vc+Vse usa en lugar de Vcsimplemente contra el caso de Vc=0cuando un clúster tiene un objeto
ttnphns
me duele la cabeza y no puedo entender cómo puedo usar esto para detener mi agrupación jerárquica aglomerativa. Lo estoy usando para el problema de vinculación de registros de agrupación de documentos
MonsterMMORPG
@Monster, existen más de 100 criterios diferentes de agrupación interna [validación] . BIC es uno de ellos. Realiza clustering hasta el final, guardando soluciones de clúster, variable de membresía de clúster en cada paso. Bueno, ahorre solo en los últimos 10 o 20 pasos porque probablemente no quiera muchos grupos pequeños. Compare las soluciones por un criterio de agrupamiento y seleccione 1-3 "mejores". Compárelos para interpretarlos. Hecho. Mira un ejemplo .
ttnphns
@ttnphns el problema aquí no puedo encontrar ningún ejemplo de datos reales de estos llamados más de 100 cosas de validación de agrupación interna. todo lo que puedo encontrar son algunas ecuaciones matemáticas que no puedo entender. esto también me hace no creer que estos algoritmos existen en realidad: D
MonsterMMORPG