Agrupación con una matriz de distancia


52

Tengo una matriz (simétrica) Mque representa la distancia entre cada par de nodos. Por ejemplo,

    ABCDEFGHIJKL
A 0 20 20 20 40 60 60 60100120120120
B 20 0 20 20 60 80 80 80120140140140
C 20 20 0 20 60 80 80 80120140140140
D 20 20 20 0 60 80 80 80120140140140
E 40 60 60 60 0 20 20 20 60 80 80 80
F 60 80 80 80 20 0 20 20 40 60 60 60
G 60 80 80 80 20 20 0 20 60 80 80 80
H 60 80 80 80 20 20 20 0 60 80 80 80
I 100120120120 60 40 60 60 0 20 20 20
J 120140140140 80 60 80 80 20 0 20 20
K 120140140140 80 60 80 80 20 20 0 20
L 120140140140 80 60 80 80 20 20 20 0

¿Existe algún método para extraer grupos de M(si es necesario, el número de grupos se puede arreglar), de modo que cada grupo contenga nodos con pequeñas distancias entre ellos. En el ejemplo, los grupos serían (A, B, C, D), (E, F, G, H)y (I, J, K, L).

Ya probé UPGMA y k-significa pero los grupos resultantes son muy malos.

Las distancias son los pasos promedio que un caminante aleatorio tomaría para ir de un nodo Aa otro B( != A) y regresar al nodo A. Está garantizado que M^1/2es una métrica. Para ejecutar k-means, no uso el centroide. Defino la distancia entre el ngrupo de nodos ccomo la distancia promedio entre ny todos los nodos c.

Muchas gracias :)


1
Debería considerar agregar la información que ya ha probado UPGMA (y otras que puede haber intentado) :)
Björn Pollex

1
Tengo una pregunta. ¿Por qué dijiste que el k-means funciona mal? He pasado su Matrix a k-means e hizo un agrupamiento perfecto. ¿No pasó el valor de k (número de grupos) a k-means?

3
@ user12023 Creo que entendiste mal la pregunta. La matriz no es una serie de puntos, son las distancias por pares entre ellos. No puede calcular el centroide de una colección de puntos cuando solo las distancias entre ellos (y no sus coordenadas reales), al menos no de manera obvia.
Stumpy Joe Pete

77
k-means no admite matrices de distancia . Nunca usa distancias punto a punto. Así que solo puedo suponer que debe haber reinterpretado su matriz como vectores , y ejecutó estos vectores ... tal vez sucedió lo mismo con los otros algoritmos que probó: esperaban datos sin procesar y pasó una matriz de distancia.
Anony-Mousse

Respuestas:


38

Hay muchas opciones.

Agrupación de k-medoides

Primero, puede intentar particionar alrededor de medoides (pam) en lugar de usar el agrupamiento k-means. Este es más robusto y podría dar mejores resultados. Van der Laan reformuló el algoritmo. Si va a implementarlo usted mismo, vale la pena leer su artículo .

Existe un algoritmo de agrupamiento de k-medoides específico para grandes conjuntos de datos. El algoritmo se llama Clara en R y se describe en el capítulo 3 de Búsqueda de grupos en datos: una introducción al análisis de conglomerados. por Kaufman, L y Rousseeuw, PJ (1990).

agrupación jerárquica

En lugar de UPGMA, puede probar otras opciones de agrupación jerárquica. En primer lugar, cuando utiliza la agrupación jerárquica, asegúrese de definir el método de partición correctamente. Este método de partición es esencialmente cómo se calculan las distancias entre observaciones y grupos. Utilizo principalmente el método de Ward o el enlace completo, pero otras opciones pueden ser la opción para usted.

No sé si ya lo intentó, pero el método de enlace único o la unión de vecinos a menudo se prefiere a UPGMA en aplicaciones filogenéticas. Si aún no lo probaste, también podrías intentarlo, ya que a menudo da resultados notablemente buenos.


En R puedes echar un vistazo al paquete de clúster . Todos los algoritmos descritos se implementan allí. Consulte "pam", "clara", "hclust" ... Compruebe también la implementación diferente del algoritmo en "kmeans". A veces, elegir otro algoritmo puede mejorar sustancialmente la agrupación.


EDITAR: solo pensé en algo: si trabajas con gráficos y nodos y similares, también deberías echar un vistazo al algoritmo de agrupación de markov. Ese se usa, por ejemplo, en la agrupación de secuencias basadas en similitudes de explosión, y funciona increíblemente bien. Puede hacer el agrupamiento por usted o darle algunas ideas sobre cómo resolver el problema de investigación en el que se está enfocando. Sin saber nada al respecto, supongo que definitivamente vale la pena ver sus resultados. Si puedo decirlo, todavía considero que este método de Stijn van Dongen es uno de los mejores resultados en agrupación que he encontrado.

http://www.micans.org/mcl/


22

Una forma de resaltar clústeres en su matriz de distancia es a través del escalado multidimensional . Al proyectar individuos (aquí lo que llaman sus nodos) en un espacio 2D, proporciona una solución comparable a la PCA. Esto no está supervisado, por lo que no podrá especificar a priori el número de clústeres, pero creo que puede ayudar a resumir rápidamente una distancia dada o una matriz de similitud.

Esto es lo que obtendría con sus datos:

tmp <- matrix(c(0,20,20,20,40,60,60,60,100,120,120,120,
                20,0,20,20,60,80,80,80,120,140,140,140,
                20,20,0,20,60,80,80,80,120,140,140,140,
                20,20,20,0,60,80,80,80,120,140,140,140,
                40,60,60,60,0,20,20,20,60,80,80,80,
                60,80,80,80,20,0,20,20,40,60,60,60,
                60,80,80,80,20,20,0,20,60,80,80,80,
                60,80,80,80,20,20,20,0,60,80,80,80,
                100,120,120,120,60,40,60,60,0,20,20,20,
                120,140,140,140,80,60,80,80,20,0,20,20,
                120,140,140,140,80,60,80,80,20,20,0,20,
                120,140,140,140,80,60,80,80,20,20,20,0),
              nr=12, dimnames=list(LETTERS[1:12], LETTERS[1:12]))
d <- as.dist(tmp)
mds.coor <- cmdscale(d)
plot(mds.coor[,1], mds.coor[,2], type="n", xlab="", ylab="")
text(jitter(mds.coor[,1]), jitter(mds.coor[,2]),
     rownames(mds.coor), cex=0.8)
abline(h=0,v=0,col="gray75")

mds

Agregué una pequeña fluctuación en las coordenadas x e y para permitir distinguir casos. Reemplace tmppor 1-tmpsi prefiere trabajar con diferencias, pero esto produce esencialmente la misma imagen. Sin embargo, aquí está la solución de agrupamiento jerárquico, con criterios de aglomeración únicos :

plot(hclust(dist(1-tmp), method="single"))

hc

Puede refinar aún más la selección de grupos basados ​​en el dendrograma, o métodos más robustos, vea, por ejemplo, esta pregunta relacionada: ¿Qué criterios de detención para el agrupamiento jerárquico aglomerativo se utilizan en la práctica?


2

La agrupación espectral [1] requiere una matriz de afinidad, la agrupación se define por las primeras funciones propias de de la descomposición deK

L=D1/2AD1/2

Con es la matriz de afinidad de los datos y es la matriz diagonal definida como (editar: perdón por no estar claro, pero puede generar una matriz de afinidad a partir de una matriz de distancia siempre que sepa el máximo posible / distancia razonable como , aunque también existen otros esquemas)ADAij=1dij/max(d)

{Di,i=jAi,jDij=0

Dado que es la descomposición propia de , con funciones propias apiladas como columnas, manteniendo solo los vectores propios más grandes en , definimos la matriz normalizada de filasXLKX

Yij=Xij(j(Xij)2)1/2

Cada fila de es un punto en y se puede agrupar con un algoritmo de agrupamiento ordinario (como K-means).YRk

Mira mi respuesta aquí para ver un ejemplo: https://stackoverflow.com/a/37933688/2874779


[1] Ng, AY, Jordan, MI y Weiss, Y. (2002). Sobre agrupamiento espectral: análisis y un algoritmo. Avances en sistemas de procesamiento de información neuronal, 2, 849-856. Pg.2


2

Lo que está haciendo es tratar de agrupar nodos de un gráfico, o red, que están cerca uno del otro. Hay todo un campo de investigación dedicado a este problema que a veces se denomina detección comunitaria en redes . Mirar su problema desde este punto de vista probablemente puede aclarar las cosas.

Encontrará muchos algoritmos dedicados a este problema y, de hecho, algunos de ellos se basan en la misma idea que tenía, que es medir distancias entre nodos con caminatas aleatorias.

El problema a menudo se formula como la optimización de la modularidad [1] donde la modularidad de una agrupación mide qué tan bien la agrupación separa la red en grupos densamente conectados (es decir, grupos donde los nodos están cerca unos de otros).

En realidad, puede demostrar que la modularidad es igual a la probabilidad de que un caminante aleatorio permanezca, después de un paso, en los mismos grupos que inicialmente menos la misma probabilidad para dos caminantes aleatorios independientes [2].

Si permite más pasos de los caminantes aleatorios, está buscando una agrupación más gruesa de la red. El número de pasos de la caminata aleatoria juega, por lo tanto, el papel de un parámetro de resolución que permite recuperar una jerarquía de grupos. En este caso, la cantidad que expresa la tendencia de los caminantes aleatorios a permanecer en su grupo inicial después de t pasos se llama estabilidad de Markov de una partición en el tiempo t [2] y es equivalente a la modularidad cuando t = 1 .

Por lo tanto, puede resolver su problema encontrando el agrupamiento de su gráfico que optimiza la estabilidad en un momento dado t , donde t es el parámetro de resolución ( t más grande le dará grupos más grandes). Uno de los métodos más utilizados para optimizar la estabilidad (o modularidad con un parámetro de resolución) es el algoritmo de Louvain [3]. Puede encontrar una implementación aquí: https://github.com/michaelschaub/generalizedLouvain .

[1] Newman, MEJ y Girvan, M. Encontrar y evaluar la estructura comunitaria en redes. Phys. Rev. E 69, 026113 (2004).

[2] Delvenne, J.-C., Yaliraki, SN y Barahona, M. Estabilidad de las comunidades gráficas a través de escalas de tiempo. Proc. Natl. Acad. Sci. 107, 12755–12760 (2010).

[3] Blondel, VD, Guillaume, J.-L., Lambiotte, R. y Lefebvre, E. Despliegue rápido de comunidades en grandes redes. J. Stat. Mech Teoría Exp. 2008, P10008 (2008).


1

Bueno, es posible realizar la agrupación de K-means en una matriz de similitud dada, primero debe centrar la matriz y luego tomar los valores propios de la matriz. El paso final y el más importante es multiplicar los dos primeros conjuntos de vectores propios a la raíz cuadrada de las diagonales de los valores propios para obtener los vectores y luego avanzar con K-means. Debajo del código se muestra cómo hacerlo. Puede cambiar la matriz de similitud. fpdist es la matriz de similitud.

mds.tau <- function(H)
{
  n <- nrow(H)
   P <- diag(n) - 1/n
   return(-0.5 * P %*% H %*% P)
  }
  B<-mds.tau(fpdist)
  eig <- eigen(B, symmetric = TRUE)
  v <- eig$values[1:2]
#convert negative values to 0.
v[v < 0] <- 0
X <- eig$vectors[, 1:2] %*% diag(sqrt(v))
library(vegan)
km <- kmeans(X,centers= 5, iter.max=1000, nstart=10000) .
#embedding using MDS
cmd<-cmdscale(fpdist)

0

Antes de intentar ejecutar el agrupamiento en la matriz, puede intentar hacer una de las técnicas de análisis factorial y conservar solo las variables más importantes para calcular la matriz de distancia. Otra cosa que puede hacer es intentar usar métodos difusos que tienden a funcionar mejor (al menos en mi experiencia) en este tipo de casos, primero intente Cmeans, Fuzzy K-medoids y Specially GKCmeans.


0

Co-clustering es una de las respuestas, creo. Pero no soy experto aquí. Co-clustring no es un método para recién nacidos, por lo que puede encontrar algunos algos en R, wiki muestra esos conceptos en el buen sentido. Otro método que no se menciona es la partición de gráficos (pero veo que el gráfico no sería escaso, la partición de gráficos sería útil si su matriz estuviera dominada por valores que significan = distancia máxima = sin similitud entre los nodos).


0

Examine la PROPAGACIÓN DE AFINIDAD. Esta técnica toma como entrada la matriz de similitud y produce un número óptimo de grupos junto con un ejemplo representativo para cada grupo.


2
¿Podría ampliar esto y explicar cómo este método ayuda en este caso?
Andy


0

También puede usar el algoritmo de Kruskal para encontrar árboles de expansión mínima, pero termina tan pronto como obtenga los tres grupos. Lo intenté de esta manera y produce los grupos que mencionaste: {ABCD}, {EFGH} y {IJKL}.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.